INotifyPropertyChanged vs ObservableCollection为单个值

时间:2016-04-22 19:51:58

标签: wpf mvvm static observablecollection inotifypropertychanged

在使用MVVM模式和WPF绑定进行编码的示例中,当它是单个值时使用INotifyPropertyChanged,而当它是值列表时使用ObservableCollection

我也读过,你不能在INotifyPropertyChanged中使用静态变量,但可以使用ObservableCollection。我想绑定到一个静态变量。

最简单的(至少对我而言)解决方法是使用ObservableCollection并始终只使用并绑定到索引0.这样做是否合适?使用INotifyPropertyChanged代替ObservableCollection是否有任何好处?

例如: 这似乎是最简单的解决方法:

public static ObservableCollection<int> MyValues { get; set;  }

<TextBox Text="{Binding MyValue[0]}">

想要这样做:

private static int _myValue;
public static int MyValue //does not work
{ 
    get { return _myValue; }
    set { _myValue = value; OnPropertyChange(); }
}

<TextBox Text="{Binding MyValue, UpdateSourceTrigger=PropertyChanged}">

2 个答案:

答案 0 :(得分:1)

我认为你的比喻是公平的(将ObservableCollectionPrimitive Type属性直接比较)。将ObservableCollection与下面的课程

进行比较
public class MyClass : INotifyPropertyChanged
{

    private string text;

    public string Text
    {
        get { return text; }
        set { text = value;
        RaiseChange("Text");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void RaiseChange(string prop)
    {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
    }
}

现在,下面两个行为都相同:

 public static MyClass Text { get; set; }

 public static ObservableCollection<string> Text { get; set; }

如果您为Text.Text = "Hello"执行MyClassText[0] = "Hello"执行ObservableCollection,则两者都会以相同方式反映。

  

现在,如果您必须使用静态属性进行绑定,那么我会建议您编写新课程而不是ObservableCollection   因为ObservableCollection有许多内部实现   对你来说任何实际消耗的记忆都可能毫无用处。   perforamnce。

答案 1 :(得分:0)

这个link可能有所帮助,它显示了List,ObservableCollection和INotifyPropertyChanged之间的区别。

希望这个帮助