2016-09-21 8 views
2

Könnte mir jemand helfen, wie kann ich ObservableCollection aktualisieren, die an ListView ItemSource gebunden ist, ohne zu blinken? Wenn ich das tue:Update ObservableCollection ohne zu blinken

Contacs = _contacs; 

das ganze ListView blinkt. Ich möchte auch in ListView suchen, aber immer nachdem die alten Ergebnisse durch neue ersetzt wurden, blinkt die Listview.

+0

Was Sie mit dem Update bedeuten sie? Ersetzen Sie das gesamte OC oder fügen Sie Datensätze hinzu oder entfernen Sie sie. – AnjumSKhan

+0

Ich ersetze die gesamte Sammlung. – JuP

+0

@rbm die "doppelte Pufferung", die Sie sagen, hat absolut nichts mit dem Problem zu tun gefragt. Der Benutzer hat nach einer besseren Möglichkeit gefragt, die Benutzerschnittstelle zu benachrichtigen, was im Backstage-Fall passiert. Der Doppelpuffer ist eine Bitmap-Optimierungstechnik, die nur für Winforms (nicht in UWP/WPF) gültig ist. –

Antwort

2

Das Problem hier ist, dass Sie die gesamte Sammlung neu zuweisen. Dies nutzt die Beobachtbarkeit nicht aus und zwingt das ListView, alle Elemente neu zu laden. Versuchen Sie stattdessen, die Elemente zu entfernen/hinzuzufügen, sodass das ListView nur die Elemente aktualisieren muss, die sich tatsächlich geändert haben.

Im Falle der Suche verstecken die unübertroffenen Ergebnisse auch eine praktikable Lösung sein. Erstellen Sie dazu eine Eigenschaft in Ihrem Kontakttyp (z. B. "IsVisible"), und binden Sie sie an die ListViewItems Visibility-Eigenschaft. (Sie können den Build in BooleanToVisibility Converter hier brauchen)

aktualisieren

Wie in den Kommentaren ein Collection mit wies darauf hin, ist die richtige Art und Weise wpf einen Suchfilter zu implementieren. Einzelheiten finden Sie unter this für die Verwendung.

+0

Es macht Sinn, wenn ich die Sammlung durch neue Daten ersetze, blinkt es. Daher sollte ich nur mit vorhandenen Quellen arbeiten und Elemente hinzufügen/entfernen. Ihre Lösung beim Suchen ist gut. – JuP

+0

Es ist ein guter Hack, aber Sie brauchen es nicht, wenn Sie solche integrierte Funktionalität mit CollectionViewSource und ICollectionView haben. –

+0

Sie haben natürlich Recht.Ich habe Ihre Antwort verknüpft – vkluge

1

Wenn Sie die Filterung in Ihrer Sammlung aktivieren möchten, müssen Sie keine Operationen direkt in Ihrer Sammlung ausführen.

Verwenden Sie ICollectionView und CollectionViewSource für diesen Zweck.

Da Sie eine ObservableCollection haben, können Sie so etwas tun.

ICollectionView contactsView; 

public ICollectionView ContactsView 
{ 
    get { return contactsView; } 
    set 
    { 
     if(contactsView != value) 
     { 
      contactsView = value; 
     } 
    } 
} 

Und in dem Setter der ObservableCollection

public ObservableCollection<ContactType> Contacs 
{ 
    get { return _contacs; } 
    set 
    { 
     if(_contacs != value) 
     { 
     _contacs = value; 
     ContactsView = CollectionViewSource.GetDefaultView(value); 
     ContactsView.Filter = ContactsFilter; 
     } 
    } 
} 

wo ContactsFilter ist eine Funktion, mit der Definition folgt.

bool ContactsFilter(object item) 
{ 
    var contact = item as ContactType; 

    if(condition) 
    return true; //show this item in ListView. 

    return false; //Do not show this item in ListView 
} 

und wann immer Sie wollen Elemente filtern, dass nur durch

ContactsView.Refresh(); 

tun kann, was ich denke, in der TextChanged Ereignis Ihrer Textfeld sein wird, in dem Sie Suchkriterien eingeben.

Ausführlichere Artikel ist unter CollectionViewSource

+0

Danke. Ich werde es versuchen. :) – JuP

+0

Sicher. Lass mich wissen wie es geht. Ich empfehle das, weil es Ihre Filterlogik trennt. –

+0

Ich habe ein Problem. Eigenschaftsfilter ist nicht in UWP:/ – JuP

Verwandte Themen