Почему 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 не будет перехватывать измененные данные.

С другой стороны: не выставляйте поля напрямую, инкапсулируйте их в свойствах. Делая это, вы можете контролировать поступление данных в класс, а также код вне самого класса не может влиять на класс нежелательными способами.

Другие вопросы по тегам