我的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
做了一些神奇的事情(这导致了这种意想不到的行为)?
答案 0 :(得分:3)
ObservableCollection实现INotifyCollectionChanged
和ListBox
(以及其他ItemsControl
s)在修改集合时进行侦听。
Steps
属性本身不会改变,它与ObservableCollection相同。
WelcomeView.Visibility绑定到Steps
,并且由于属性值未更改而未更新,因此它保留相同的对象引用。
尝试创建绑定到Steps.Count
属性(转换器应修改为使用int value
)
<view:WelcomeView Visibility="{Binding Steps.Count, Converter={StaticResource CollapseIfZeroCount}}"/>
或
bool HasItems
中有ItemsControl
个属性。我会与ElementName
和BooleanToVisibilityConverter
<view:WelcomeView "{Binding ElementName=Lst, Path=HasItems, Converter={StaticResource Bool2Visibility}}"/>
<ListBox Name="Lst" ItemsSource="{Binding Steps}" />