【问题标题】:Why DisplayMemeberPath doesn't accept a standard property?为什么 DisplayMemeberPath 不接受标准属性?
【发布时间】:2010-11-22 11:51:31
【问题描述】:

我将一个对象列表绑定到一个组合框。

<ComboBox Name="comboPerson"  DisplayMemberPath="Name"/>

后面的代码如下所示:

List<Person> myFriends = new List<Person>()
{
    new Person("Jack", "Daniels", 8),
    new Person("Milla", "Jovovovich", 35),
    new Person("Umma", "Turman", 34)
};

comboPerson.ItemsSource = myFriends;

如果我使用标准属性,它不会显示名称,但是,如果通过 get 访问器访问该属性,它就可以工作。这就是我的意思:

工作版本:

public string Name { get; set; }
public string Surnamge { get; set; }
public int Age { get; set; }

public Person(string name, string surname, int age)
{
    this.Name = name;
    this.Surnamge = surname;
    this.Age = age;
}

非工作版本:

public string Name;
public string Surnamge;
public int Age;

public Person(string name, string surname, int age)
{
    this.Name = name;
    this.Surnamge = surname;
    this.Age = age;
}

问题是:为什么 WPF 无法从标准属性中获取值?

【问题讨论】:

    标签: wpf binding itemsource


    【解决方案1】:

    你的“非工作”版本不使用属性,它使用公共字段,你通常不应该使用它,因为它违反了Encapsulation。

    WPF 被设计成只能通过其访问器访问属性。字段不是通过访问器访问的(如果您使用{get;set;} 语法,则由编译器生成),而是直接访问。如果您使用属性,您还可以利用自动更新之类的好处(如果您正确实施INotifyPropertyChanged)。

    所以,如果你想在 WPF 中使用 Binding,你需要使用属性。

    【讨论】:

    • 但是如果类库使用Fields而不是属性怎么办?那我该如何绑定这些呢?
    • 您无法绑定到字段。您可以编写一个包装类,它采用库类的实例并将其字段公开为属性。
    • 为了在我的包装类中获得通知机制,我是否必须每 n 秒检查一次库中的更改,然后触发 PropertyCnaged 事件?
    • 是的,这是有可能的,如果您预计值会随时间变化。
    【解决方案2】:

    第二个代码不包含标准属性,它包含字段。 WPF需要属性,你也应该实现INotifyPropertyChanged,否则wpf不会捕捉到变化的数据。

    另外注意:不要直接暴露字段,将它们封装在属性中。这样做,您可以控制进入类的数据,而且类本身之外的代码也不能以不想要的方式影响类。

    【讨论】:

    • 谢谢,我知道使用字段不是一个好习惯,我使用字段只是为了测试绑定,但后来我意识到WPF不能使用字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多