ICollectionView刷新时样式将被忽略

时间:2018-11-19 02:09:09

标签: wpf data-binding

我有一个视图模型,它定义了一个List<string>。这是使用公开的ICollectionView公开的:

List<string> _items { get; } = new List<string>() { "Test item" };
public ICollectionView CollectionView { get; }
....
        CollectionView = CollectionViewSource.GetDefaultView(_items);
        CollectionView.Filter = FilterItems;

CollectionView对象还定义了一个FilterItems函数来过滤列表。

在UI端,我有一个ListBox,它定义了一个数据模板并绑定到CollectionView,并且一切正常。最初,我为每个列表框项目得到了这些警告:

System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

但是我通过在窗口中添加适用于所有ListBoxItem的样式来消除了它们:

<Window.Resources>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
    </Style>
</Window.Resources>

但是,每当我在Refresh()上调用CollectionView时,该样式似乎都不再适用,因为上面的两个警告会针对每个列表项再次出现!实际上,还有一些其他错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

这是怎么回事?为什么刷新集合时会忽略样式?

奇怪的是,我可以通过将样式移出Window.Resource并将其放入App.xaml中的Application.Resource中来解决此问题,但我不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

这些绑定错误是无害的,并在内部进行处理,因此您可以放心地忽略它们,或取消它们。请参阅以下链接以获取更多信息。

解决WPF中无害的绑定错误: https://weblogs.asp.net/akjoshi/resolving-un-harmful-binding-errors-in-wpf

您可能还想阅读MSDN论坛上的this主题。