2016-09-05 3 views
1

)私のWPFプロジェクトに奇妙な問題があります。私はにバインドされたObservableCollection<T>を持っています。アイテムを追加および削除すると、バインディングが機能し、リストに正しい結果が表示されます。ObservableCollection Visibilityバインディングを解除しないでください(

問題は、この同じプロパティを別のXAMLコントロールにバインドすることですが、リストから項目を削除するときにコンバーターをトリガーしません。アイテムを追加すると機能します。

関連するXAMLは

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

され、コンバータは、私は、コンバータでのブレークポイントを持っている

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; 
} 

です。新しい項目が追加されると、ブレークポイントがヒットします。既存のアイテムが削除されると、ブレークポイントはヒットしません。

WPFは私が気付いていないListBoxで何か魔法を尽くしますか(この予期しない動作につながっています)?

答えて

3

ObservableCollectionは、コレクションが変更されたときにリッスンします。INotifyCollectionChangedおよびListBox(および他のItemsControl)は、リッスンします。

Stepsプロパティ自体は変更されません。同じObservableCollectionです。

WelcomeView.VisibilityがStepsにバインドされており、プロパティ値が変更されていないために更新されません。は、同じオブジェクト参照を保持します。

ItemsControlbool HasItems性がある

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

又は

(コンバータがint valueを使用するように変更されなければならない)Steps.Countプロパティへの結合を作成してみてください。私はそうElementNameBooleanToVisibilityConverter

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

と結合するだろうだろう、別のオプションは、私のWelcomeViewがINotifyCollectionChanged' 'に加入することですか? – Dave

+1

@Dave、そうだと思いますが、それは可能ですが、より多くの努力が必要です。必要に応じてWelcomeViewの購読を解除することを確認する必要があります。 – ASh

+1

OnPropertyChanged( "Steps")も起動できます。 (単純な回避策として)あなたのビューモデル内の項目を削除した後、手動で – WPFGermany

関連する問題