2017-06-20 3 views
0

Quelle est la meilleure façon de faire des propriétés calculées dans le framework Prism MVVM? J'ai une Xamarin.Forms application avec les propriétés suivantes sur une machine virtuelle:Propriétés calculées dans Prism

private string _title; 
public string Title 
{ 
    get { return _title; } 
    set 
    { 
     SetProperty(ref _title, value); 
     OnPropertyChanged(() => Message); 
    } 
} 

private string _name = "John"; 
public string Name 
{ 
    get { return _name; } 
    set 
    { 
     SetProperty(ref _name, value); 
     OnPropertyChanged(() => Message); 
    } 
} 

public string Message 
{ 
    get { return String.Format("{0},{1}", Name, Title); } 
} 

Le code fonctionne très bien. Cependant, la bibliothèque Prism m'avertit sur les instructions OnPropertyChanged pour utiliser RaisePropertyChanged ce qui évitera l'utilisation de chaînes magiques et que OnPropertyChanged avec une expression est moins efficace.

Existe-t-il une autre méthode pour notifier l'affichage de relire "Message" lorsque le nom ou le titre change? Cela m'a amené à penser que peut-être Prism a un moyen de configurer les choses afin que "Nom" et "Titre" n'aient pas besoin d'être au courant du Message pour que le Message soit mis à jour. Ce serait préférable si possible. Quelle est la façon "Prism" de faire des propriétés calculées? Je ne trouve aucun exemple de cela dans leur documentation Xamarin.Forms.

+0

La ligne 'SetProperty (ref _name, value);' et le fait que tous les modèles de vue héritent de 'BindableBase' (une implémentation de' INotifyPropertyChanged') mettent déjà à jour l'interface utilisateur chaque fois que vous mettez à jour ces propriétés. Vous n'avez jamais besoin d'appeler explicitement 'RaisePropertyChanged' ou' OnPropertyChanged'. Par conséquent, vous devez faire de votre message une propriété comme Name. – ethane

Répondre

1

Si vous essayez de le faire le plus difficile comme vous pouvez faire quelque chose comme ce qui suit:

public class FooViewModel : BindableBase 
{ 
    private string _foo; 
    public string Foo 
    { 
     get => _foo; 
     set => SetProperty(ref _foo, value,() => RaisePropertyChanged(nameof(FooBar))); 
    } 

    public string FooBar => $"{Foo} Bar"; 
} 

Si vous voulez faire de votre vie un peu plus facile, installez PropertyChanged.Fody et vous pouvez juste avoir un ViewModel comme ce qui suit:

public class SomeViewModel : BindableBase 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string FullName => $"{FirstName} {LastName}"; 
} 

Fody devrait vous donner un Weavers.xml vide, vous voulez juste mettre à jour pour ressembler à:

<?xml version="1.0" encoding="utf-8"?> 
<Weavers> 
    <PropertyChanged EventInvokerNames="RaisePropertyChanged" /> 
</Weavers> 
+0

Est-ce que Fody fonctionne avec Xamarin.Forms? – Sean

+0

En fait, juste fait une recherche sur Internet et il semble que Fody fonctionne. Merci pour le premier exemple de code. – Sean

+1

Pas un problème. Oui ça marche, je l'utilise dans tous mes projets maintenant. –