Я хочу предотвратить выполнение события ValueChanged, пока я инициализирую форму данными.
У меня есть 2 конструкторов форм (Wpf Window). Проблема со вторым, используемым для обновления записи.
Это код 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(), если он уже выполнен (и флаг установлен в значение false), когда ValueChanged запущен.
Мое текущее решение состоит в том, чтобы изменить флаг IsInitialized с помощью ValueChangedCounter, чтобы я мог поставить 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();