如何在wpf ViewModel中实现observable int?

在我的mvvm ViewModel中,我有这样的字段

public int Delta { get; private set; } 

但是当我更新它时:

 Delta = newValue; 

用户界面未刷新。

我以为数据绑定会为我做这件事。 例如,我可以将集合声明为ObservableCollection ,然后数据绑定将起作用。

但是没有ObservableInt ,怎么说查看它需要刷新呢?

可能我应该提出一些事件“通知财产改变”或什么?

你有两个选择:

  1. 在您的类上实现INotifyPropertyChanged接口。
  2. inheritance自DependencyObject并将Delta实现为DependencyProperty。

最简单的选择是#1。 您可以非常轻松地在类上实现INotifyPropertyChanged接口:

 public class YourClass : INotifyPropertyChanged { private int _delta; public int Delta { get { return _delta; } set { _delta = value; NotifyPropertyChanged("Delta"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (null != handler) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } 

您可以阅读有关在MSDN上使用和实现依赖项属性的更多信息。

使用@LBushKin的答案,我将其修改为

 public class Prop : INotifyPropertyChanged { private T _value; public T Value { get { return _value; } set { _value = value; NotifyPropertyChanged("Value"); } } public event PropertyChangedEventHandler PropertyChanged; internal void NotifyPropertyChanged(String propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } 

并设置它:

 class MainWindow ... // a bool with initial value of true public static Prop optionBool { get; set; } = new Prop{ Value = true }; private void Window_Loaded(object sender, RoutedEventArgs e) { // connect UI to be able to use the Prop DataContext = this; } 

并使用它:

  

这里还有一个Collection和2-Properties版本: Utils.ObservableProperties.cs (这个repo包含几个相关的类)

只需在您的类中实现INotifyPropertyChanged接口,并使用它为您的Property引发PropertyChanged,然后UI将更新。 如果您正在使用MVVM项目模板,那么您很可能已经实现了一个只需要使用它的辅助方法。

MSDN INotifyPropertyChanged

GalaSoft MVVM Light工具包

ObservableCollection会自动引发事件,但对于您自己的属性,您必须自己引发事件。

这里有一个很好的例子: http : //www.codeproject.com/Tips/228352/Naming-Properties-in-MVVM?display=Print

我建议使用mvvm light: http ://mvvmlight.codeplex.com,我在silverlight和wpf应用程序中使用它。 非常易于使用,并在模型,视图模型和视图之间提供消息系统。

虽然我们正在努力改进答案,但c#6.0和7.0的其他一些新增function有助于使其更加紧凑:

 public class Prop : INotifyPropertyChanged { private T _value; public T Value { get => _value; set { _value = value; NotifyPropertyChanged(nameof(_value)); } } public event PropertyChangedEventHandler PropertyChanged; internal void NotifyPropertyChanged(String propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } 

这样,您不使用任何“embbeded values”(即 – 属性的名称)并保持代码重构安全。

而且由于c#6.0和7.0的全新Expression主体function,也不需要冗余代码块