C#WPF INotifyPropertyChanged未更新表单



我正在尝试实现一个表单,其中包含一些基于用户输入的计算。使用MVVM模式,特别是INotifyPropertyChanged。

当用户在文本框中输入一个值,启动计算例程,并根据结果更新表单时,一切都很好。

然而,当输入从codeehind更改时,Inotify例程会启动,计算完成,但绑定控件不会更新。

我有两个问题:

  1. 使用框架内的页面,我想在页面更改时触发刷新
  2. 导入Xml文件中以前保存的数据。同样,例程会触发,但不会更新窗体的绑定控件

我已经附上了代码的浓缩版本,但我认为这并不是真正的问题。注意,我使用的是singleton类。

感谢

================

//INotify code
using s = Calc.Models.GlobalStrings;
namespace Calc.ViewModels.INotify
{
public class UcIOChanged : INotifyPropertyChanged
{
private static UcIOChanged instance;
public UcIOChanged() { }
//Make the class is a singleton
public static UcIOChanged Instance
{
get
{
if (instance == null)
{
instance = new UcIOChanged();
}
return instance;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public string Pressure 
{ 
get 
{ 
return s.Pressure; 
} 
set 
{ 
s.Pressure = value; OnPropertyChanged(); 
} 
}
public void OnPropertyChanged()
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Pressure)));
}
}
}

注意,我使用的是一个singleton类。

此代码中没有错误。但您可能使用错误。为了避免意外的使用错误,我建议您更改实现:

public class UcIOChanged
{
// Hide the constructor to avoid
// accidentally creating other instances.
private UcIOChanged() {}
//Make the class is a singleton
public static UcIOChanged Instance { get; } = new UcIOChanged();
public string Pressure
{
get
{
return s.Pressure;
}
set
{
if (!Equals(s.Pressure, value))
{
s.Pressure = value;
PressureChanged?.Invoke(this, EventArgs.Empty);
}
}
}
// The event of the same name.
// It's easier for one or two properties
// than the INotifyPropertyChanged implementation.
public event EventHandler PressureChanged;
}

使用:

<TextBox Text="{Binding Pressure, Source={x:Static local:UcIOChanged.Instance}}"/>

p.S.如果您在代码中的某个位置更改s.Pressure,而不是通过UcOChanged.instance的实例,则可能会影响正确的操作。
因此,您必须确保只有在收到更改通知后才能访问此变量(属性或字段?(。

最新更新