0

オブジェクトのリストを 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 が標準のプロパティから値を取得できないのかということです。

4

2 に答える 2

2

「非動作」バージョンはプロパティを使用せず、カプセル化に違反するため、通常は使用しないパブリック フィールドを使用します。

WPF は、アクセサーを介してのみプロパティにアクセスするように設計されています。{get;set;}フィールドは、アクセサー (構文を使用する場合にコンパイラーによって生成される) を介してアクセスされるのではなく、直接アクセスされます。プロパティを使用すると、自動更新などの優れた機能も利用できます (INotifyPropertyChanged適切に実装すれば)。

したがって、WPF で Binding を使用する場合は、プロパティを使用する必要があります。

于 2010-11-22T11:58:30.517 に答える
1

2 番目のコードには、標準のプロパティは含まれていません。フィールドが含まれています。WPF にはプロパティが必要です。また、実装する必要がありますINotifyPropertyChanged。そうしないと、wpf は変更されたデータをキャッチしません。

別の注意: フィールドを直接公開しないでください。プロパティにカプセル化してください。そうすることで、クラスに入るデータを制御できます。また、クラス自体の外部のコードが望ましくない方法でクラスに影響を与えることもできません。

于 2010-11-22T11:57:40.840 に答える