在使用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}">
答案 0 :(得分:1)
我认为你的比喻是公平的(将ObservableCollection
与Primitive 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"
执行MyClass
或Text[0] = "Hello"
执行ObservableCollection
,则两者都会以相同方式反映。
现在,如果您必须使用静态属性进行绑定,那么我会建议您编写新课程而不是
ObservableCollection
因为ObservableCollection
有许多内部实现 对你来说任何实际消耗的记忆都可能毫无用处。 perforamnce。 强>
答案 1 :(得分:0)
这个link可能有所帮助,它显示了List,ObservableCollection和INotifyPropertyChanged之间的区别。
希望这个帮助