c# - 在初始化 ViewModel 时防止执行 ValueChanged
问题描述
我想在使用数据初始化表单时阻止 ValueChanged 事件的执行。
我有 2 个表单构造函数(Wpf 窗口)。问题在于第二个,用于条目更新。
这是 xaml.cs 代码:
public MyForm() // for new entry
{
InitializeComponent();
DataContext = MyViewModel;
}
public MyForm(int id) // for entry update - PROBLEM!
{
InitializeComponent();
DataContext = MyViewModel;
MyViewModel.PreapareFormWithData(id); // load data
}
private void dteDate_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
{
if (!MyViewModel.IsInitializing) // PROBLEM!
MyViewModel.DateChanged();
}
在我创建 MyForm 的新实例并调用 ShowDialog() 后,事件 dteDate_EditValueChanged 被触发(因为 MyModel.Date 是从数据库中设置的,而不是因为用户更改了 GUI 控件上的值)。
我试图通过将 IsInitializing 标志设置为 false 来避免这种情况,但问题是 PreapareFormWithData() 方法如果在触发 ValueChanged 时已经执行(并且标志设置为 false)。
我当前的解决方案是使用 ValueChangedCounter 更改 IsInitialized 标志,因此我可以将 ValueChangedCounter > 1 改为 od !IsInitialized,但我对这种解决方案并不满意。
这是我的 ViewModel.cs
private MyViewModel _MyViewModel;
public MyViewModel MyViewModel
{
get
{
if (_MyViewModel== null)
_MyViewModel = new MyViewModel();
return _MyViewModel;
}
set { _MyViewModel= value; OnPropertyChanged("MyViewModel"); }
}
public bool IsInitializing = true; // flag
public MyViewModel() { }
public void PreapareFormWithData(int id)
{
MyModel = MyModel.GetData(id);
IsInitializing = false; // data loading completed, set flag to false
}
public void DateChanged()
{
// MyModel.Date changed, do some stuff...
}
我的模型:
public class MyModel
{
public DateTime Date { get; set; } // without OnPropertyChanged()...
}
解决方案
代替
if (!MyViewModel.IsInitializing) // PROBLEM!
MyViewModel.DateChanged();
和
if (!IsLoaded) return;
MyViewModel.DateChanged();
推荐阅读
- c# - 在系统启动时启动 WPF 应用程序时出错
- xcode - 在 Xcode 中使用断点时应用程序崩溃
- python - 如 guppy 所述,长期运行项目的奇怪内存消耗
- xcode - 如何在 Apple Watch 上从 xcode 运行我的应用程序?
- html - DataTables:如何将第一列(ID)显示为超链接?
- r - ifelse 替换值,如果它低于以前的值
- javascript - 获取动态页面YOffset
- javascript - 在反应中已路由组件内的组件之间切换
- image-processing - 用 Python 绘制 fftshifted 图像后查找高频中心的坐标
- docker - Nginx:代理到另一个 nginx 实例:网关超时