首页 > 解决方案 > 在初始化 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()...
}

标签: c#.netwpf

解决方案


代替

if (!MyViewModel.IsInitializing) // PROBLEM!
    MyViewModel.DateChanged();

if (!IsLoaded) return;

MyViewModel.DateChanged();

推荐阅读