【发布时间】:2016-08-16 13:56:57
【问题描述】:
在使用 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}">
【问题讨论】:
-
"这样做合适吗?"如果它有效,那么它就有效。只要您没有遇到任何性能问题,那么我认为就可以了。因为就像您说的那样,您不能将静态属性与 INotifyPropertyChanged 一起使用。我不知道在 ObservableCollection 上使用 INPC 有什么好处,因为它们通常以不同的方式使用,但在这种情况下,您不能在静态属性上使用 INPC。
-
你也可能对这个问题的接受答案感兴趣stackoverflow.com/questions/14614190/…
-
将属性包装在视图模型中,将视图模型放入静态属性中。完成。
-
我最好将该静态属性移到另一个类中,从中生成单例,然后像往常一样绑定。至少看起来并不比使用带有单个元素的集合更糟糕。
-
您还可以在视图模型中定义常规(非静态)属性,但使其引用 getter\setter 中的静态字段。这样您仍然可以进行常规绑定,但可以达到与静态属性相同的效果。
标签: wpf mvvm static observablecollection inotifypropertychanged