Une bonne façon de rafraîchir la liaison de données sur toutes les propriétés d'un ViewModel lors des changements de Modèle
Version Courte
Si je mettre à jour le Modèle d'objet que mon ViewModel enveloppements, ce qui est un bonne façon de biens d'incendie-changement des notifications pour toutes les propriétés du modèle que mon ViewModel expose?
Version Détaillée
Je suis en développement WPF client à la suite de la pattern MVVM, et essaie de gérer les mises à jour, à partir d'un service, les données affichées dans mes Vues. Lorsque le client reçoit une mise à jour, la mise à jour s'affiche sous la forme d'un DTO qui-je l'utiliser comme un Modèle.
Si ce modèle est une mise à jour d'un modèle existant dans la Vue, je veux de l'associé ViewModel pour mettre à jour ses propriétés liées aux données, de sorte que le point de Vue reflète les changements.
Permettez-moi d'illustrer avec un exemple. Envisager de mon Modèle:
class FooModel
{
public int FooModelProperty { get; set; }
}
Enveloppé dans un ViewModel:
class FooViewModel
{
private FooModel _model;
public FooModel Model
{
get { return _model; }
set
{
_model = value;
OnPropertyChanged("Model");
}
}
public int FooViewModelProperty
{
get { return Model.FooModelProperty; }
set
{
Model.FooModelProperty = value;
OnPropertyChanged("FooViewModelProperty");
}
}
Le Problème:
Quand un modèle mis à jour arrive, j'ai mis le Dernier Modèle de la propriété, comme suit:
instanceOfFooVM.Model = newModel;
Cela provoque OnPropertyChanged("Model")
à feu, mais pas OnPropertyChanged("FooViewModelProperty")
, à moins que j'appelle le dernier explicitement à partir de Model
s'setter. Donc, un point de Vue lié à FooViewModelProperty
ne sera pas mise à jour pour afficher la nouvelle valeur de la propriété quand j'ai changer de Modèle.
Appelant explicitement OnPropertyChanged
pour tous les exposés des propriétés du Modèle n'est évidemment pas une solution souhaitable, et ni est la prise de la newModel
et d'itération grâce à ses propriétés de mettre à jour le ViewModel les propriétés d'un-à-un.
Ce qui est une meilleure approche de ce problème de mise à jour d'un modèle dans son ensemble et d'avoir le feu des notifications de changement pour l'ensemble de ses propriétés exposées?
Vous devez vous connecter pour publier un commentaire.
Selon la docs:
null
commepropertyName
valeur et ne pas obtenir tous les bindings propriétés de mise à jour, Cependant, l'utilisation destring.Empty
commepropertyName
valeur de ne mise à jour de toutes les classes liées propriétés.Une option est à l'écoute de vos propres événements, et de faire un helper de routine pour élever les autres notifications requises.
Cela peut être aussi simple que d'ajouter, dans votre constructeur:
OnPropertyChanged
appels pour toutes les propriétés exposées par mon ViewModel; lorsque les propriétés sont ajoutés, par exemple, cet ensemble doit être tenu à jour. Je crois que @Joe White a frappé lors de ce dont j'ai besoin...À chaque fois que votre
Model
propriété est définie, abonnez-vous à sa proprePropertyChanged
événement. Lorsque votre gestionnaire est appelé, le feu de votre proprePropertyChanged
événement. Lorsque leModel
est autre chose, retirez votre gestionnaire de la vieilleModel
.Exemple:
Pour VB.net si quelqu'un d'autre en a besoin. Si vous avez déjà mis en œuvre "INotifyPropertyChanged" alors que la dernière ligne est tout ce dont vous avez besoin.