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: Donc, je voudrais lier mon bouton Enregistrer sur cette propriété: P> <Button IsEnabled="{Binding HasChanges, Mode=OneWay}"...
5 Réponses :
Votre viewModel doit mettre en œuvre mise à jour: p>
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 inotifypropertychanged code> et devrait soulever l'événement de l'état de propriété pour
HASCHANGES code> lorsque vous modifiez un client dans
clients p> p> p> p> P>
CollectionChangeDevent Code> de vos clients code> Collection CODE>. P>
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. P>
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. P>
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));
}
}
}
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. P>
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);