Почему DisplayMemeberPath не принимает стандартное свойство?
Я связываю список объектов с ComboBox.
<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 не может получить значение из стандартного свойства?
2 ответа
Ваша "нерабочая" версия не использует свойства, она использует открытые поля, которые вы обычно не должны использовать, поскольку она нарушает инкапсуляцию.
WPF разработан так, что он получает доступ к свойствам только через их методы доступа. Доступ к полям не осуществляется через методы доступа (которые генерируются компилятором, если вы используете {get;set;}
синтаксис), но напрямую. Если вы используете свойства, вы также можете воспользоваться полезными вещами, такими как автоматическое обновление (если вы реализуете INotifyPropertyChanged
должным образом).
Итак, если вы хотите использовать Binding в WPF, вам нужно будет использовать свойства.
Второй код не содержит стандартных свойств, он содержит поля. WPF нужны свойства, также вы должны реализовать INotifyPropertyChanged
иначе wpf не будет перехватывать измененные данные.
С другой стороны: не выставляйте поля напрямую, инкапсулируйте их в свойствах. Делая это, вы можете контролировать поступление данных в класс, а также код вне самого класса не может влиять на класс нежелательными способами.