Как модели представления распространяют уведомление об изменении из своих базовых моделей, если модель не реализует INotifyPropertyChanged? - PullRequest
7 голосов
/ 10 июля 2011

Чтение Статья Джоша Смита о MVVM его модель представления CustomerViewModel реализует INotifyPropertyChanged, но не базовый Customer класс.

Я вижу только один (возможный) способ заставить уведомление об изменениях работать в этом случае - вносить изменения только в CustomerViewModel, а не Customer. В таком случае, должна ли бэкэнд-логика моей программы просто работать с ViewModels? Это кажется довольно странным, ведь они View Модели в конце концов.

Кто-нибудь, кто может это немного прояснить?

Спасибо!

Пояснение:

Скажите, что у меня есть модель цитаты и список цитат.

public class Quote
{
    public string Name { get; set; }
    public decimal Value { get; set; }
}

public QuoteViewModel : INotifyPropertyChanged
{
    private Quote quote;

    public event EventHandler PropertyChanged;

    public decimal Value 
    { 
         get { return quote.Value; }
         set
         { 
               quote.Value = value;
               PropertyChanged("Value");
         }
    }                  
}

Теперь, если Quote изменяется в результате фонового потока, опрашивающего веб-сервис, пользовательский интерфейс не будет уведомлен об этом, поскольку Quote не реализует INotifyPropertyChanged, если только все части системы не используют ViewModel?

Ответы [ 2 ]

2 голосов
/ 10 июля 2011

Я предполагаю, что в своем примере он использует уведомление для распространения изменений на одну часть представления на другие части представления.Поскольку различные части предположительно связаны с одной и той же моделью представления, это будет работать.

Re logic validation;В любом случае, я бы не стал основывать это на событиях перемен;во-первых, потому что это будет лот четных подписок (в отличие от пользовательского интерфейса, где вы привязываете только то, о чем заботится пользовательский интерфейс ), а во-вторых, это, вероятно, слишком важно, чтобы рискнуть пропустить;модель не выполняет валидацию внутри себя (так как изменения происходят), тогда я просто запустил бы логику валидации явно перед коммитом, рассматривая элементы в целом.Это также позволяет избежать «кратко противоречивой» проблемы, то есть, когда вы планируете внести несколько изменений, которые приводят к действительной модели, но если вы проверяете немедленно , либо найти неловко, либопоследовательность, которая позволяет вам сделать изменения, которые вы хотите, или совершенно невозможно.Откладывая проверку, это уходит.

0 голосов
/ 11 июля 2011

Марк делает несколько замечательных замечаний, но, похоже, вам действительно нужно изменить модель вне контекста вашего пользовательского интерфейса.Рассмотрите возможность реализации INotifyPropertyChanged на вашей модели, но, как отметил Марк, это, вероятно, будет немного проблематично и, безусловно, потребует значительного тестирования.Этот подход будет работать лучше всего, если ваша модель POCO.Если он может удвоиться как psuedo-VM, доступная во всех виртуальных машинах, которые его используют, то, возможно, вы сможете минимизировать или исключить подписку на событие модели VM->:

public QuoteViewModel : INotifyPropertyChanged
{
  private Quote quote;
  public event EventHandler PropertyChanged;
  public INotifyPropertyChanged Quote
  {
    get { return quote; }
    set
    {
      quote = value;
      PropertyChanged("Quote");
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...