当我在控件上设置DataSource并想将.ToString()用作DisplayMember时,我需要最后设置DisplayMember,否则ValueMember将覆盖它。

MSDN on empty string as display member:



复制代码:

类(class):

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 = "";

您可以尝试制作新表格并添加2个组合框。

结果:

c# - 为什么ValueMember会覆盖空的DisplayMember-LMLPHP

结论和问题:

可以通过以正确的顺序设置它们来轻松解决此问题,但是这很容易出错,如果我将实际属性用作DisplayMember而不是""/ToString,它也不会显示此行为。

我真的很想知道为什么它会显示此行为,以及是否可以将.ToString()显式设置为DisplayMember(为了代码清晰)。

最佳答案

我在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;

所以现在我们到了问题的根源

关于c# - 为什么ValueMember会覆盖空的DisplayMember,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46364985/

10-09 16:04