У меня есть модель представления, которая определяет 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
для фильтрации списка.
На стороне пользовательского интерфейса у меня есть 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
s:
<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 и поместив его в Application.Resource в App.xaml, но я не понимаю, почему это так.