2013-06-18 7 views
0

У меня окно с панелью меню. Есть 3 пунктов меню (команды):Проверьте, не изменилось ли свойство

  • New File
  • Загрузить файл
  • Сохранить файл

В моей MVVM, у меня есть несколько propertys. Если пользователь загружает файл, свойства будут заполнены. Пользователь может что-то сделать в программе (изменить значение свойств ..) и может сохранить значения свойств в XML-файл. Итак, если пользователь сохраняет файл и нажимает «Новый файл», будет создан новый файл, что означает, что я «сброшу» все свойства. Если пользователь что-то делает в программе и не сохранил файл и не щелкнул мышью, а затем в «Новый файл», появится MessageBox. Он должен сказать: «Вы действительно хотите, чтобы сохранить файл, .... несохраненные файлы будут перезаписаны» (думаю, вы знаете, что я имею в виду ..)

Итак, чтобы очистить его, вот некоторые сценарии:

  • Пользователь изменяет propertys в программе и нажимает на «New File» -> MessageBox выскакивает
  • Пользователь изменяет propertys в программе и нажимает на «Сохранить файл» и нажимает на «New File» -> propertys будет сброшена
  • Пользователь нажимает на «Загрузить файл» и нажимает «Новый файл» -> Свойства будут сброшены

Как я могу проверить, изменилось ли свойство? Я мог бы иметь глобальное логическое значение «HasChanged». Если пользователь нажимает кнопку «Сохранить» или «Загрузить», HasChanged = false. Если пользователь что-то делает, HasChanged = true ... Я мог бы разместить это в каждом сетевом устройстве, но это глупое решение ...

+0

Вы можете установить флаг после подключения к [ 'PropertyChanged'] (http://msdn.microsoft.com/en-US/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx) события внутри view model ... –

+0

Я использую PropertyChanged следующим образом: 'RaisePropertyChanged (() => Number);' и использовать его из ObservableObject, поэтому я не могу изменить метод. – Rudi

+1

Но вы можете подписаться на * событие * внутри модели представления. Он будет уволен каждый раз, когда будет изменено любое свойство, которое уведомляет ... –

ответ

1

Простой пример. Добавьте виртуальный (или реализуйте непосредственно в базовом классе) и создайте флаг IsDirty. Я всегда создаю базовый класс и внедряю эти методы там и создаю некоторые виртуальные методы OnSaved(), OnLoaded() и т.д. В этом случае вы можете иметь базовую функциональность, но все же можете добавлять пользовательскую логику в унаследованные классы.

public bool IsDirty { get; private set; } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
    var handler = this.PropertyChanged; 

    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 

     this.OnPropertyChanged(propertyName); 
    } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
    IsDirty = true; 
    } 

    public void Save() 
    { 
    IsDirty = false; 
    } 
Смежные вопросы