gpt4 book ai didi

c# - 如何将附加行为添加到 CollectionViewSource?

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:07 27 4
gpt4 key购买 nike

我正在尝试向 CollectionViewSource 添加附加行为,以便我可以在 XAML 中的 View 模型上提供过滤器 Predicate 属性。

XAML 如下所示:

<DataGrid ItemsSource="{Binding}">
<DataGrid.DataContext>
<CollectionViewSource Source="{Binding Path=Items}"
acb:CollectionViewSourceItemFilter.ItemFilter="{Binding Path=ItemFilter}" />
</DataGrid.DataContext>
</DataGrid>

但是,我收到一个错误:

A 'Binding' cannot be set on the 'SetItemFilter' property of type   
'CollectionViewSource'. A 'Binding' can only be set on a DependencyProperty of a
DependencyObject.

CollectionViewSource 似乎是一个 DependencyObject。我不确定我做错了什么。

行为代码如下:

public static class CollectionViewSourceItemFilter
{
/// <summary>
/// Gets the property value.
/// </summary>
public static Predicate<object> GetItemFilter(CollectionViewSource collectionViewSource)
{
return (Predicate<object>)collectionViewSource.GetValue(ItemFilter);
}

/// <summary>
/// Sets the property value.
/// </summary>
public static void SetItemFilter(CollectionViewSource collectionViewSource, Predicate<object> value)
{
collectionViewSource.SetValue(ItemFilter, value);
}

/// <summary>
/// The ItemFilter dependency property.
/// </summary>
public static readonly DependencyProperty ItemFilter =
DependencyProperty.RegisterAttached(
"ItemFilter",
typeof(Predicate<object>),
typeof(ItemFilterBehavior),
new UIPropertyMetadata(null, OnItemFilterChanged));

private static void OnItemFilterChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
CollectionViewSource collectionViewSource = depObj as CollectionViewSource;
if (collectionViewSource == null)
return;

if (!Equals(e.NewValue, e.OldValue))
{
var newFilter = (Predicate<object>)e.NewValue;

// Remove any previous filter.
ItemFilterBehavior oldBehavior;
if (behaviors.TryGetValue(collectionViewSource, out oldBehavior))
{
oldBehavior.Unregister();
behaviors.Remove(collectionViewSource);
}

if (newFilter != null)
behaviors.Add(collectionViewSource, new ItemFilterBehavior(collectionViewSource, newFilter));
}
}

private class ItemFilterBehavior
{
public ItemFilterBehavior(CollectionViewSource collectionViewSource, Predicate<object> filter)
{
_collectionViewSource = collectionViewSource;
_filter = filter;
_collectionViewSource.Filter += collectionViewSource_Filter;
}

void collectionViewSource_Filter(object sender, FilterEventArgs e)
{
e.Accepted = _filter(e.Item);
}

public void Unregister()
{
_collectionViewSource.Filter -= collectionViewSource_Filter;
}

private readonly CollectionViewSource _collectionViewSource;
private readonly Predicate<object> _filter;
}

private static readonly IDictionary<CollectionViewSource, ItemFilterBehavior> behaviors = new ConcurrentDictionary<CollectionViewSource, ItemFilterBehavior>();
}

最佳答案

在问题中发布行为代码让我明白了。我的 DependencyProperty 使用 ItemFilterBehavior 而不是 CollectionViewSourceItemFilter 作为所有者类型。

关于c# - 如何将附加行为添加到 CollectionViewSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com