ObservableCollection Remove()未触发Visibility绑定

时间:2016-09-05 08:09:29

标签: wpf xaml listbox

我的WPF项目有一个奇怪的问题。我有ObservableCollection<T>绑定到ListBox。当我添加和删除项目时,绑定工作,列表显示正确的结果。

我遇到的问题是,我还将此相同的属性绑定到另一个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做了一些神奇的事情(这导致了这种意想不到的行为)?

1 个答案:

答案 0 :(得分:3)

ObservableCollection实现INotifyCollectionChangedListBox(以及其他ItemsControl s)在修改集合时进行侦听。

Steps属性本身不会改变,它与ObservableCollection相同。

WelcomeView.Visibility绑定到Steps,并且由于属性值未更改而未更新,因此它保留相同的对象引用。

尝试创建绑定到Steps.Count属性(转换器应修改为使用int value

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

bool HasItems中有ItemsControl个属性。我会与ElementNameBooleanToVisibilityConverter

进行约束
<view:WelcomeView "{Binding ElementName=Lst, Path=HasItems, Converter={StaticResource Bool2Visibility}}"/>
<ListBox Name="Lst" ItemsSource="{Binding Steps}" />