在初始化ViewModel时阻止ValueChanged执行

时间:2018-10-31 17:40:20

标签: c# .net wpf

我要在初始化带有数据的表单时阻止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()...
}

1 个答案:

答案 0 :(得分:0)

替换

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

if (!IsLoaded) return;

MyViewModel.DateChanged();