0

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

<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 无法从标准属性中获取值?

4

2 回答 2

2

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

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

因此,如果要在 WPF 中使用 Binding,则需要使用属性。

于 2010-11-22T11:58:30.517 回答
1

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

另一方面:不要直接公开字段,将它们封装在属性中。这样做,您可以控制进入类的数据,并且类本身之外的代码也不能以不需要的方式影响类。

于 2010-11-22T11:57:40.840 回答