Ich kürze mal den Code aufs Wesentliche:
Mein View sieht so aus:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <ListView x:Name="listViewJobs" ItemsSource="{Binding Jobs, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="listViewJobs_SelectionChanged"> <ListView.ItemContainerStyle> ... </ListView.ItemContainerStyle> <ListView.ItemTemplate> <DataTemplate> <StackPanel> ... <CheckBox IsChecked="{Binding IsActive}" Content="Aktiv" IsHitTestVisible="False" /> ... </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> |
Das ViewModel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| public class JobsVm : INotifyPropertyChanged { public JobsVm() { Initialize(); } private void Jobs_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { OnPropertyChanged("Jobs"); }
private void OnPropertyChanged(string prop) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
public event PropertyChangedEventHandler PropertyChanged; public void PauseResumeJob(int Id) { if(Jobs.Where(x => x.JobId.Equals(Id)).SingleOrDefault().IsActive) { Model.Current.PauseJob(Id); Jobs.Where(x => x.JobId.Equals(Id)).SingleOrDefault().IsActive = false; } else { Model.Current.ResumeJob(Id); Jobs.Where(x => x.JobId.Equals(Id)).SingleOrDefault().IsActive = true; } } public async void Initialize() { }
public ObservableCollection<JobForUser> Jobs { get; set; } } |
So wie du es beschreibst mache ich es auch. Das ViewModel kümmert sich nur um seine Collections und redet mit dem Model. (In meinem Fall ein Singleton was mit WCF mit dem Server redet)
Das View ruft den Krempel im ViewModel auf oder bindet sich daran was ich da bereitgestellt habe.
Im ViewModel sind noch Methoden Add und Delete, die habe ich hier für die Veranschaulichung nicht mitgenommen, die fügen Jobs was hinzu oder nehmen was weg.
Dann wird auch korrekterweise CollectionChanged aufgerufen und ich sehe wie in der Liste ein Element dazukommt oder verschwindet.
Ich möchte allerdings nur das Häkchen eines bestehenden Listenelements verändern, je nachdem wie ich die "IsActive" Eigenschaft eines Job-Objektes ändere.
Da passiert komischerweise nichts, selbst wenn ich PropertyChanged aufrufe.