No modelo MVVM, o modelo deve implementar a interface INotifyPropertyChanged?

Eu tenho uma idéia clara sobre View e ViewModel no padrão MVVM. Estou planejando implementar o padrão MVVM no meu aplicativo. Estou enfrentando um problema em relação ao modelo. Eu tenho o arquivo .xml que é analisado e as informações são exibidas na Visualização.

Preciso ser notificado sobre as alterações no modelo pela primeira vez apenas. De agora em diante, preciso ser notificado.

Então, como implementar o modelo?

Devo implementar a interface INotifyPropertyChanged na class de modelo também? (Eu li que o modelo não deve implementar a interface INotifyPropertyChanged , uma vez que é específico do WPF)

Implementar INotifyPropertyChanged em modelos é totalmente aceitável –

Normalmente, o modelo implementa os resources que facilitam a vinculação à exibição. Isso geralmente significa que ele suporta a propriedade e a coleta de notificação alterada por meio das interfaces INotifyPropertyChanged e INotifyCollectionChanged . As classs de modelos que representam collections de objects normalmente derivam da class ObservableCollection , que fornece uma implementação da interface INotifyCollectionChanged .

Embora cabe a você decidir se quer esse tipo de implementação ou não, mas lembre-se –

E se suas classs de modelo não implementarem as interfaces necessárias?

Às vezes, você precisará trabalhar com objects de modelo que não implementam as interfaces INotifyPropertyChanged , INotifyCollectionChanged , IDataErrorInfo ou INotifyDataErrorInfo . Nesses casos, o modelo de exibição pode precisar envolver os objects de modelo e expor as propriedades necessárias à exibição. Os valores para essas propriedades serão fornecidos diretamente pelos objects do modelo. O modelo de visualização implementará as interfaces necessárias para as propriedades expostas, de modo que a exibição possa facilmente vincular-se a elas.

Retirado de – http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

Eu trabalhei em alguns projetos onde não implementamos o INotifyPropertyChanged em nossos modelos e, devido a isso, enfrentamos muitos problemas; a duplicação desnecessária de propriedades era necessária na VM e, ao mesmo tempo, tínhamos que atualizar o object subjacente (com valores atualizados) antes de passá-los para o BL / DL.

Você enfrentará problemas especialmente se precisar trabalhar com a coleta de seus objects de modelo (digamos, em uma grade ou lista editável) ou modelos complexos; objects de modelo não serão atualizados automaticamente e você terá que gerenciar tudo isso em sua VM.

A abordagem padrão do MVVM é implementar o INotifyPropertyChanged apenas no ViewModel. O objective é atualizar as ligações apropriadas na Visualização quando algo mudar no ViewModel.

No entanto, isso direciona as alterações para o ViewModel pelo modo de exibição . Ou seja, quando você altera o valor em um TextBox , a implementação de INotifyPropertyChanged no ViewModel atualizará as vinculações relacionadas, portanto, o View é atualizado corretamente.

Ele não cobre as alterações feitas no Modelo por uma fonte externa, como alterações do database ou outra interface. Contanto que todas as modificações de dados sejam provenientes da Visualização, o ViewModel deve estar ciente de todas as alterações e saber o que atualizar. Por exemplo, se você souber que alterar a variável Foo no seu Modelo também alterará o valor da Bar em seu Modelo, seria aconselhável chamar OnPropertyChanged(Foo) e OnPropertyChanged(Bar) em seu ViewModel quando você alterar o valor de Foo .

A outra alternativa é usar events entre o Model e o ViewModel para atualizar esses valores no ViewModel que requerem atualização. Se, como você diz, a notificação for necessária “somente na primeira vez”, a implementação de uma atualização manual de desligamento em algum acionador também deverá funcionar.

Esse é um problema muito comum ao trabalhar com o MVVM, INotifyPropertyChanged não é específico do WPF, pois faz parte do System.ComponentModel portanto, não é necessário include nenhuma referência específica do WPF na sua solução.

Se você implementar o INofityPropertyChanged em seu modelo, poderá salvar muito mais código no ViewModel (Proxy Properties). Portanto, é aceitável para o modelo ter INotifyPropertyChanged .

Às vezes, é aceitável que o modelo implemente a interface INotifyPropertyChanged .

Por exemplo, se o modelo tiver muitas propriedades a serem visualizadas e você desejar evitar implementar muitos códigos (propriedades de proxy) no viewmodel para expor essas propriedades de modelo.

Veja em http://msdn.microsoft.com/pt-br/magazine/ff798279.aspx

Esse é um argumento clássico entre os codificadores MVVM “puros” e outros.

Eu costumo ir pelos livros sempre que posso porque na maioria das vezes isso faz sentido. No entanto, em certos cenários, improvisar o código de acordo com as necessidades reduz muito o código duplicado.

No seu caso, você pode ler o XML em uma class de modelo e fazer uma cópia da class de modelo no viewmodel ou copiar as propriedades desejadas do modelo para o modelo de visualização. Desta forma, você tem controle para atualizar a interface do usuário / modelo. Se você seguir a primeira abordagem, será necessário implementar Inotifypropertychanged em sua class de modelo e será aceitável.

Tendo dito que eu tentaria o meu melhor nível para seguir a segunda abordagem, porque isso me daria controle preciso sobre todas as propriedades que são exibidas / manipuladas na visão. Além disso, vou me sentir muito melhor que eu não estou quebrando o padrão MVVM.

Não tenho certeza sobre o que você quer dizer. Na VM, você pode ter INotifyPropertyChanged ou DependencyProperty-es (nesse caso, a VM deve derivar de DependencyObject ). Não faz sentido ter ambos. Também não faz sentido não ter nenhum deles.

No modelo, você pode fazer o que quiser. A capacidade de triggersr / receber events é boa, mas nem sempre você pode confiar neles. Basicamente, o modelo depende dos dados de origem e materiais relacionados, enquanto o viewmodel tem a carga de interface do modelo com a camada de apresentação. Como o WPF trabalha em events, pelo menos a VM deve fornecer algum mecanismo de notificação.