我要在初始化带有数据的表单时阻止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来避免这种情况,但是问题是,在触发ValueChanged时,PreapareFormWithData()方法是否已经执行(并且标志设置为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()...
}
答案 0 :(得分:0)
替换
if (!MyViewModel.IsInitializing) // PROBLEM!
MyViewModel.DateChanged();
与
if (!IsLoaded) return;
MyViewModel.DateChanged();