2016-09-05 3 views
1

Ich habe ein seltsames Problem mit meinem WPF-Projekt. Ich habe eine ObservableCollection<T> an eine ListBox gebunden. Wenn ich Elemente hinzufüge und entferne, funktioniert die Bindung und die Liste zeigt die korrekten Ergebnisse an.ObservableCollection Remove() feuert nicht auf Sichtbarkeitsbindung

Das Problem, das ich habe, ist, bin ich auch diese Eigenschaft an ein anderes XAML-Steuerelement binden, aber es löst nicht den Konverter, wenn ich ein Element aus der Liste entfernen. Es funktioniert, wenn ich Gegenstände hinzufüge.

Die entsprechende XAML ist

<view:WelcomeView Visibility="{Binding Steps, Converter={StaticResource CollapseIfZero}}"/> 
<ListBox ItemsSource="{Binding Steps}" /> 

Und die Konverter

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    var col = value as ICollection; 
    return col.Count == 0 ? Visibility.Visible : Visibility.Collapsed; 
} 

ich einen Haltepunkt in dem Konverter habe. Wenn ein neues Element hinzugefügt wird, wird der Haltepunkt getroffen. Wenn ein vorhandenes Objekt entfernt wird, wird der Unterbrechungspunkt nicht getroffen.

Macht WPF etwas Magisches mit dem ListBox was mir nicht bekannt ist (was zu diesem unerwarteten Verhalten geführt hat)?

Antwort

3

ObservableCollection implementiert INotifyCollectionChanged und ListBox (und andere ItemsControl s) hört ab, wenn die Sammlung geändert wurde.

Steps Eigenschaft selbst ändert sich nicht, es ist die gleiche ObservableCollection.

WelcomeView.Visibility zu Steps gebunden ist, und nicht aktualisiert, weil Eigenschaftswert nicht geändert hat, hält es die gleiche Objekt Referenz.

versuchen erstellen Steps.Count Eigenschaft Bindung (Konverter sollte int value modifiziert werden, zu verwenden)

in ItemsControl
<view:WelcomeView Visibility="{Binding Steps.Count, Converter={StaticResource CollapseIfZeroCount}}"/> 

oder

gibt es bool HasItems Eigenschaft. Ich würde eine Bindung mit ElementName und BooleanToVisibilityConverter

<view:WelcomeView "{Binding ElementName=Lst, Path=HasItems, Converter={StaticResource Bool2Visibility}}"/> 
<ListBox Name="Lst" ItemsSource="{Binding Steps}" /> 
+0

machen, so wäre eine weitere Option ist mein WelcomeView zu 'INotifyCollectionChanged' abonnieren haben? – Dave

+1

@Dave, ich denke, ja, es ist möglich, erfordert aber mehr Anstrengungen. Sie müssen sicherstellen, dass sich WelcomeView bei Bedarf abmeldet – ASh

+1

Sie können auch OnPropertyChanged ("Steps") auslösen; manuell nach dem Entfernen eines Elements in Ihrem Viewmodel (als einfache Arbeit). – WPFGermany