6
votes

Comment se lier à la propriété avec seulement obtenir un accessor

J'ai une liste d'autoroute modifiable personnalisée sur ma fenêtre WPF. J'ai aussi une classe de menuLodel avec la propriété modifiée qui ressemble à celle: xxx pré>

Donc, je voudrais lier mon bouton Enregistrer sur cette propriété: P>

<Button IsEnabled="{Binding HasChanges, Mode=OneWay}"...


0 commentaires

5 Réponses :


1
votes

Votre viewModel doit mettre en œuvre inotifypropertychanged et devrait soulever l'événement de l'état de propriété pour HASCHANGES lorsque vous modifiez un client dans clients

mise à jour:

Si les clients implémentent INOTIFYPROPERTYCHANGED ET CLIENTS IT SOI est une collection observable. Vous pouvez vous abonner et, en fonction de l'action Desubscribe, à tous les clients de la collection CollectionChangeDevent de vos clients Collection .


0 commentaires

0
votes

Si votre viewModel implémente inotifyPropertychangned, vous devez simplement appeler la méthode onproperTychanged () sur les haschanges. Avec prisme, la méthode équivalente est une change propropretychangned.

Toutefois, avec MVVM, vous voudrez peut-être mettre ce test dans la méthode Canexecute de votre commande qui est liée à la propriété de votre bouton de commande. Cela gérera l'isenabled automatiquement.


0 commentaires

2
votes

Pour que WPF réagisse à des modifications des propriétés, la classe doit implémenter inotifypropertychanged interface code>. Vous devez envoyer des notifications chaque fois qu'un client est modifié, comme celui-ci:

class CustomerList : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    private List<Customer> customers = ...
    public bool HasChanges {
        get {
            return customers.Any(customer => customer.Changed);
        }
    }
    // Callers who change customers inside your list must call this method
    public void ChangeCustomer(Customer c) {
        // Do whatever you need to do, ...
        ...
        // then send out the notification to WPF
        OnPropertyChanged("HasChanges");
    }
    protected void OnPropertyChanged(string name) {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}


0 commentaires

0
votes

Le bouton doit en quelque sorte recevoir des notifications. Dans votre cas, vous implémentez probablement l'interface inotifypropertychanged dans votre viewModel. Lorsque votre "ligne de liste de liste est modifiée", vous devriez soulever l'événement de l'état de propriété pour la propriété "HASCHANGES". Les changements doivent cependant être remarqués dans votre viewModel et là que l'événement devrait être soulevé. Comme une solution différente puisque vous avez une vieilleModel, vous pouvez utiliser une commande sur votre bouton et que la logique aurait la logique de retour vrai ou fausse, qui doit également être marquée par vous lorsque des modifications sont arrivées.


0 commentaires

2
votes

La bonne façon de faire face aux boutons consiste à implémenter Icommand interface. Voici un exemple de ma solution:

public ICommand MyCommand { get; private set; }

//in constructor:
MyCommand = new RelayCommand(_ => SomeActionOnButtonClick(), _ => HasChanges);


0 commentaires