WPF绑定INotifyPropertyChanged

时间:2014-04-10 07:35:37

标签: wpf binding inotifypropertychanged

我有一个理论问题。

<ListBox ItemSource= "{Binding Fruits}" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Color}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox

我们假设我的ViewModel中有ObservableCollection<Fruit> Fruits。 水果不是我的课,所以当水果颜色改变时,我无法实现INotifyPropertyChanged。 我知道在我的ViewModel中更改了这些属性,例如:

public ChangeColor()
{
Fruits[1].Color = "Blue";
//Notify Fruits Here, How?
}
  1. 怎么做?
  2. 在幕后实现INotifyPropertyChanged时如何工作?如果我有ObservableCollection Fruits和Fruit Color属性更改,它会发送类似NotifyPropertyChanged(&#34; Fruits.Name&#34;)?

2 个答案:

答案 0 :(得分:1)

  1. “水果不是我的班级”,你的意思是水果类是由别人写的还是封装成一些dll?如果是这样,你仍然可以继承Fruit并实现INotifyPropertyChanged接口,例如:
    public class FruitsEx : Fruits, INotifyPropertyChanged
    {
        public Color ColorEx
        {
            get { return this.Color; }
            set
            {
                this.Color = value;
    if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("ColorEx")); } } } // INotifyPropertyChanged event public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) {
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
  2. 通过这种方式,您可以使用ColorEx属性来通知更改。

    1. INotifyPropertyChanged和ObservableCollection用于不同的目的。 当集合中的项目发生更改(例如,添加或删除)时,ObservableCollection将更新目标列表。但是,如果您想更改集合中项目的颜色,则需要为该项目实现INotifyPropertyChanged。
    2. 要记住的一件事是,如果你这样做

      new ObservableCollection<T>()

      目标不会更新。因为ObservableCollection本身并没有实现通知机制。

答案 1 :(得分:0)

正如Jehof在评论中提到的,这里的关键是创建一个FruitViewModel来包装你的水果模型。 在这种情况下,您需要告诉特定的FruitviewModel在其中一个属性上调用OnPropertyChanged才能工作。 (&#34; Fruits.Name&#34;)将无效。