Запретить выполнение ValueChanged во время инициализации ViewModel

2

Я хочу предотвратить выполнение события 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()...
}
Теги:
wpf

1 ответ

0
Лучший ответ

замещать

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

с

if (!IsLoaded) return;

MyViewModel.DateChanged();
  • 0
    Спасибо за свойство IsLoaded. Я немного изменил его, поэтому мой код на самом деле if (IsLoaded) {MyViewModel.DateChanged (); }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню