【发布时间】:2021-08-25 17:51:49
【问题描述】:
我正在尝试使用基于用户输入的一些计算来实现一个表单。使用 MVVM 模式,特别是 INotifyPropertyChanged。
当用户在文本框中输入一个值,计算例程被触发,并且表单随结果更新时,一切都很好。
但是,当从代码隐藏更改输入时,Inotify 例程会触发,计算完成,但绑定的控件不会更新。
我有两个问题:
- 使用框架内的页面,我想在页面改变时触发刷新
- 导入以前保存在 Xml 文件中的数据。同样,例程会触发,但不会更新表单的绑定控件。
我附上了代码的精简版本,但这并不是我认为的真正问题。注意我使用的是单例类。
谢谢
================
//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)));
}
}
}
【问题讨论】:
-
这可能会有所帮助。在绑定到 Pressure 属性的 UI 元素上,尝试以下 UpdateSourceTrigger=PropertyChanged.. 例如
-
请注意,
nameof(Pressure)绝对不应该在 OnPropertyChanged 方法中。应该有一个字符串参数,并且应该像OnPropertyChanged(nameof(Pressure));一样调用该方法 -
@Saurav 所说的不正确。
UpdateSourceTrigger=PropertyChanged与 INotifyPropertyChanged 接口的 PropertyChanged 事件无关。它控制其他绑定方向(从目标到源)的工作方式,并且对 OneWay 绑定(仅从源到目标)没有任何影响。 -
关于@Saurav 评论,我在 XML 中确实有这样的代码。此外,当一个输入属性发生变化时,它会更新许多其他绑定结果,这在我提供的代码示例中没有显示。
标签: c# wpf inotifypropertychanged