2017-06-17 5 views
0

Ich habe eine ListView mit ObservableCollection als ItemsSource. Wie stelle ich sicher, dass die Listenansicht auf Änderungen in einzelnen Sammlungselementen reagiert?Notify ListView einer Änderung in einem Artikel

Grundsätzlich möchte ich eine Listenansicht mit wechselnden Hintergründen für Elemente. Wenn ein Element in der Mitte der Liste eingefügt wird, muss der Hintergrund für alles danach umgedreht werden. Der einzige Weg, den ich gefunden habe, war durch ersetzt jedes betroffene Element in der Sammlung, die auf iOS in hässliche visuelle Effekte übersetzt. Ich möchte nur den Hintergrund neu zeichnen.

Einfach binden die Hintergrund-Eigenschaft funktioniert nicht: Es gibt keine Benachrichtigung über die Änderung der Eigenschaft.

Vielleicht gibt es eine Möglichkeit, eine benutzerdefinierte Benachrichtigung an alle/einige sichtbare Zeilen im ListView zu senden?

Antwort

1

Wenn Sie 10 haben, dann muss MyClassINotifiyPropertyChanged implementieren, um die gebundene UI zu benachrichtigen, dass sich ihre Eigenschaften geändert haben.

+0

Um zu verdeutlichen - mit 'MyClass' meinen Sie die Klasse des Elements in der' ObservableCollection' (d. H. 'ItemsSource = ObservableCollection ')? Auch - was sollte die Implementierung von 'INotifiyPropertyChanged' tun? – user1334767

+0

Ja, welche Klasse in der ObservableCollection enthalten ist. INotifyPropertyChanged ist in dem verknüpften Artikel und in 1000 anderen Stellen in SO und im gesamten Web dokumentiert, daher werde ich hier keine weitere ausführliche Erläuterung geben. Grundsätzlich wird ein PropertyChanged-Ereignis ausgelöst, wenn eine Eigenschaft in Ihrer Klasse aktualisiert wird. – Jason

+0

Danke - hat wunderbar funktioniert! – user1334767

0

Der beste Ansatz, den ich gerade denke, ist MessagingCenter. Legen Sie eine Nachricht fest, wenn sich die Sammlung ändert, und ändern Sie für den Nachrichtenprozess den Hintergrund abhängig von der tatsächlichen Zeile des Elements.

Diese Nachricht sollte in der ViewCell (oder in welcher Zelle) implementiert werden, die Sie verwenden, um die Daten dem Benutzer zu präsentieren. So können Sie etwas tun:

public MyViewCell() 
{ 
    MessagingCenter.Subscribe<object>(this as object, "UpdateBackground", (obj) => 
    { 
     //Your logic to change background here 
    }); 
} 

Und wenn Ihre Sammlung Änderungen (das auf dem Controller, Ansichtsmodell oder Code-behind), um die Nachricht senden diesem Code auszuführen

MessagingCenter.Send(this as object, "UpdateBackground"); 

Meine einzige Sorge ist, dass Wenn Sie eine große Anzahl von Nachrichten abonnieren (1 ViewCell pro Element), wird sich dies auf das Gedächtnis auswirken, aber ich hoffe, dass dies zu einer besseren Option führt.

Die andere Sache, die ich vorschlagen kann, ist UITableView (iOS) und Listview (auf Android) zu überprüfen und sehen, wenn Sie diese mit Renderers Gewohnheit erreichen

Mit freundlichen Grüßen

EDIT: Sie auch kann DataTemplateSelector verwenden, um (abhängig von der Objektbindung an die Ansicht) zu ermitteln, welche ItemTemplate verwendet. Ich weiß, ob die Sammlung die DataTemplateSelector-Neuzeichnungen ändert oder irgendwie eine "Aktualisierung" in die ListView zurückruft und neue Daten präsentiert. Wenn es so ist, ist ein besserer Ansatz als das, was ich dir vorher gesagt habe. Ich werde es morgen nur zum Spaß versuchen.

Verwandte Themen