Я построил фильтрацию Behavior
для CollectionViewSource
, она обычно работает и используется следующим образом:Связывание свойство а UIElement от статического ресурса
<CollectionViewSource Source="{Binding ListOfStuff}" x:Key="FilteredListOfStuff">
<i:Interaction.Behaviors>
<behaviors:FilterBehavior>
<behaviors:PropertyFilter Property="SomePropName">
<behaviors:TextFilter FilterText="filter text"/>
</behaviors:PropertyFilter>
</behaviors:FilterBehavior>
</i:Interaction.Behaviors>
</CollectionViewSource>
Проблема заключается в том, что, как я теперь понимаю, я могу 't связывает свойства фильтра с UIElements, потому что CollectionViewSource
является статическим ресурсом.
То, что я хотел, и теперь не может сделать это:
<behaviors:TextFilter FilterText="{Binding ElementName=TheSearchTextBox, Path=Text}"/>
Есть ли способ обойти это? Мое поведение фильтрации основано на использовании события CollectionViewSource.Filter
, есть ли хороший и чистый способ фильтрации без «CollectionViewSource»? То есть, добавьте поведение фильтра непосредственно в ItemsControl
s (DataGrid, ListBox и т. Д.)?
я могу решить эту проблему путем связывания TheSearchTextBox.Text
и FilterText
к тому же ViewModel собственности, но такого рода перерывов MVVM как фильтрация является чисто «View» действие ...
EDIT Добавление поведения фильтра код:
[ContentPropertyAttribute("Filters")]
public class FilterBehavior : Behavior<CollectionViewSource>
{
private List<IFilter> _filters;
public List<IFilter> Filters
{
get
{
return _filters ??
(_filters = new List<IFilter>());
}
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Filter += CollectionViewSource_Filter;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.Filter -= CollectionViewSource_Filter;
}
void CollectionViewSource_Filter(object sender, FilterEventArgs e)
{
if (Filters != null)
{
e.Accepted = Filters.All((f) => !f.IsEnabled || f.Filter(e.Item));
}
}
}
Почему «CollectionViewSource» должен быть статическим ресурсом? Я предполагаю, что, поскольку вы хотите привязываться к некоторому элементу визуального дерева, вы будете использовать его только один раз? Таким образом, вы можете определить его непосредственно в визуальном дереве, где привязка должна работать. – LionAM
Можете ли вы опубликовать код своего поведения? Вы можете напрямую вставить Поведение в элемент управления, где это необходимо. – AnjumSKhan
Вы всегда можете использовать Mode = OneWay для отправки значения из TextBox в ваш staticresource, если ваш StaticResource является DepObject. – AnjumSKhan