Диалог Silverlight MVVM IEditableObject - PullRequest
1 голос
/ 28 июня 2011

Я играю с демо-приложением BookShelf от John Papa. И хотел бы внести некоторые коррективы в то, как редактируется элемент книги. В этом приложении и BookView, и EditBookWindow привязаны к одному и тому же ViewModel BookViewModel, что нормально.

Выбор книги приведет к открытию окна EditBookWindow в дочернем окне

private void OnLaunchEditBook(LaunchEditBookMessage msg)
{
    var editBook = new EditBookWindow();
    editBook.Show();
}

Если вы отредактируете любое из значений, данные для выбранной книги будут обновлены в BookViewModel. Теперь это где проблема возникает. Если вы нажмете «Отмена» в диалоговом окне, изменения все равно сохранятся.

private void OKButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

private void CancelButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
}

То, что я хотел бы сделать, это изменить это на «откат» сущности до ее состояния, прежде чем вы откроете диалоговое окно и начнете редактирование.

Мой поиск в Google по этой проблеме заставляет меня думать, что наиболее эффективным (и простым) способом решения этой проблемы является использование интерфейса IEditableObject: BeginEdit, EndEdit или CancelEdit.

У меня проблемы с выяснением, как реализовать этот интерфейс. Поскольку и EditBookWindow, и BookView совместно используют одну и ту же ViewModel, измененный элемент сохраняется в свойстве SelectedBook

private Book _selectedBook;
public Book SelectedBook
{
    get { return _selectedBook; }
    set
    {
        _selectedBook = value;
        RaisePropertyChanged("SelectedBook");
    }
}
  1. Является ли IEditableObject наиболее простым способом решения моей проблемы?
  2. Может кто-нибудь дать несколько указаний о том, где (ViewModel, Views) и как я могу реализовать интерфейс?

1 Ответ

2 голосов
/ 29 июня 2011

Это та же проблема, о которой говорит этот пост , и может быть применено то же решение.:-)

Короче говоря, создайте копию вашей модели, инициализируйте с ней подробный вид.Либо удерживайте копию вашей модели внутри модели представления и сбрасывайте ее при нажатии кнопки отмены.Или перезагрузите элемент из источника данных при отмене.

Редактировать :

Если вы хотите использовать IEditableObject, вы можете сохранить модель на BeginEdit, очиститьсохраненное состояние на EndEdit, и используйте сохраненное состояние для восстановления исходного состояния на CancelEdit.Использование JavaScriptSerialize r значительно упрощает создание резервных копий.

Использование IEditableObject - это всего лишь вариант, но не совсем другая концепция.При использовании IEditableObject модель сама отвечает за работу с механизмом отката.В первом подходе ViewModel несет ответственность.

Если вы можете редактировать Model, используя IEditableObject, это нормально, но часто вы не можете изменить модель, например, если ваша модель генерируется прокси при доступе к веб-службе.

...