代码之家  ›  专栏  ›  技术社区  ›  EpicKip

为什么ValueMember覆盖空的DisplayMember

  •  5
  • EpicKip  · 技术社区  · 8 年前

    当我设置 DataSource .ToString() DisplayMember ,我需要设置 显示值 ValueMember 将覆盖它。

    MSDN on empty string as display member:

    要复制的代码:

    类别:

    class SomeClass
    {
        public string PartA { get; set; }
        public string PartB { get; set; }
        public string WrongPart { get { return "WRONG";  } }
    
        public override string ToString()
        {
            return $"{PartA} - {PartB}";
        }
    }
    

    var testObj = new SomeClass() { PartA = "A", PartB = "B" };
    comboBox1.DataSource = new [] { testObj };
    comboBox1.DisplayMember = "";
    comboBox1.ValueMember = "WrongPart";
    
    comboBox2.DataSource = new[] { testObj };
    comboBox2.ValueMember = "WrongPart";
    comboBox2.DisplayMember = "";
    

    您可以通过创建一个新表单并添加两个组合框来尝试。

    结果:

    enter image description here

    通过将它们设置为正确的顺序,可以很容易地解决这个问题。但是,这很容易出错。如果我将实际属性用作DisplayMember而不是 "" ToString .

    我真的很想知道为什么它会显示这种行为,如果我可以设置 显式作为DisplayMember(为了代码清晰)。

    1 回复  |  直到 8 年前
        1
  •  2
  •   EpicKip    8 年前

    the reference source 找到了这个位子:

    if (!newValueMember.Equals(valueMember)) {
    // If the displayMember is set to the EmptyString, then recreate the dataConnection
    //
    if (DisplayMember.Length == 0)
        SetDataConnection(DataSource, newValueMember, false);
    

    SetDataConnection方法签名:

    private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force)
    

    这将设置一个新的DisplayMember

    displayMember = newDisplayMember;
    

    现在我们已经找到了问题的根源