Почему DisplayMemeberPath не принимает стандартное свойство? - PullRequest
0 голосов
/ 22 ноября 2010

Я связываю Список объектов с 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 ]

2 голосов
/ 22 ноября 2010

ваша "нерабочая" версия не использует Свойства, она использует открытые поля, которые вы обычно не должны использовать, поскольку она нарушает Инкапсуляция .

WPF разработан так, что он толькополучает доступ к свойствам через их методы доступа.Доступ к полям осуществляется не через средства доступа (которые генерируются компилятором, если вы используете синтаксис {get;set;}), а напрямую.Если вы используете свойства, вы также можете воспользоваться такими полезными вещами, как автоматическое обновление (если вы правильно внедрили INotifyPropertyChanged).

Итак, если вы хотите использовать Binding в WPF, вам нужно будет использовать свойства.

1 голос
/ 22 ноября 2010

Второй код не содержит стандартных свойств, он содержит поля.WPF нужны свойства, также вы должны реализовать INotifyPropertyChanged, иначе wpf не будет перехватывать измененные данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...