Hallo!
Ich habe eine ICollectionView mit einer Gruppierung und einer Sortierung (nach MediaPosition).
Einer ListView ordne ich diese (ICollection)View als SourceCollection zu.
In einer ListView-Spalte setze ich für das CellTemplate ein DataTemplate das ein UserControl beinhaltet:
<ListView ItemsSource="{Binding ImportMedienListeView}" IsSynchronizedWithCurrentItem="True"
>
<ListView.ItemsPanel>
...
</ListView.ItemsPanel>
<ListView.View>
<GridView>
<!-- Bild -->
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<local:UCMediaElement
MediaSource2="{Binding MediaBild}"
MediaBereich="{Binding MediaBereich}"
MediaDateiName="{Binding MediaDateiName}"
IsÜbernahmeRelevant="{Binding IsÜbernahmeRelevant}"
MediaPosition="{Binding MediaPosition, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
>
</local:UCMediaElement>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.GroupStyle>
...
</ListView.GroupStyle>
</ListView>
Bis hierher alles Standard... (siehe auch Bild)
In dem UserControl kann man die MediaPosition ändern.
Die Änderung wirkt sich erst auf die View aus, wenn man die View Refresh(t):
ImportMedienListeView.Refresh(); // Import-Medien View aktualisieren
Meine Frage ist jetzt, wie kann ich auf eine Änderung einer (gebundenen) Eigenschaft in der (Icollection)View reagieren?
Die View selbst hat nur CollectionChanged und CurrentChanged - Events (trifft Beides nicht zu). Dem UserControl habe ich noch ein PositionChanged-Event spendiert. Dieses könnte ich im DataTemplate durch einen Behavior abfangen und die View refreshen.
Aber es muss (?) doch auch im ViewModel gehen! Oder?
Das UserControl hat DP's zur Übergabe/Übernahme der Werte.
Die gebundene Eigenschaft der Source-Liste benutzt INotifyPropertyChanged:
/// <summary>
/// Anzeige-Position des importierten Media-Objekt's.
/// </summary>
public int MediaPosition { get => _MediaPosition;
set { _MediaPosition = value; OnChanged(nameof(MediaPosition)); } }
Durch das Binding des UserControls wird der Media-Wert geändert, aber ein "einklinken" in den Setter ist bestimmt auch nicht der richtige Weg....
Du kannst Dein XAML Code einfach als XML Format deklarieren, statt als C#.
Dann isses auch besser lesbar.
Hallo!
Wie das manchmal so ist ... im praktischen macht die unmittelbare Aktualisierung einer Eigenschaft in der ICollectionView nur Sinn (egal ob über ein UserControl oder direkt)), wenn diese Eigenschaft nicht in der Sortierung und erst recht nicht in der Gruppierung enthalten ist! In beiden Fällen zieht man ansonsten dem Benutzer das Element, wo er gerade einen Wert ändert, unter der Maus weg! 😃 Mehrfachänderungen führen in den Wahnsinn 😃 😃
In meinem Fall sind es sogar 2 Eigenschaften (CheckBox = Soll das Element übernommen werden und Integer = Position innerhalb der Gruppe).
Ich habe es jetzt so gelöst, dass der Benutzer erst alle Werte ändern kann und danach eine Aktualisierungs-Schaltfläche anklickt, um die Aktualisierung der ICollectionView (refresh()) auszulösen. Bei diesem Vorgang ist ein wenig Logik implementiert, so dass alle Elemente (UserControls) an dem gewünschten Ort erscheinen (Sortiert und Gruppiert). Der Benutzer kann sich die Auswirkungen seiner Änderung(en) erst noch einmal ansehen und ggf. ändern. (Eine Aktualisierung nehme ich intern immer vor...)
Wenn die Änderungs-Eigenschaft nicht in der Sortierung oder Gruppierung enthalten ist, muss man erst recht nichts machen, da die Eigenschaften ja durch das UserControl-Binding geändert werden und so für die weitere Verarbeitung aktuell zur Verfügung stehen.
Vielen Dank für das (zahlreiche) Interesse an meinem Problem!