DependencyProperty的PropertyChangedCallback忽略延迟绑定

时间:2018-11-23 15:16:50

标签: c# wpf xaml

我有一个带有文本框的用户控件和一个自定义列表控件,该控件基本上是一个具有CollectionView的ListBox。我想使用CollectionView的过滤器功能,并使用文本框中的文本来过滤可见元素。

xaml的简化表示:

<TextBox x:Name="FilterTextControl"/>
<CustomControls:OverviewControl
    x:Name="ProfileOverviewControl"
    FilterText="{Binding ElementName=FilterTextControl, Path=Text, Mode=OneWay, Delay=5000}"
    Items="{Binding AllItems}"/>

CollectionViewSource:

<CollectionViewSource x:Key="GroupedProfiles"
                  Source="{Binding Items, RelativeSource={RelativeSource AncestorType=local:OverviewControl}}"
                  Filter="GroupedProfiles_OnFilter">
<CollectionViewSource.SortDescriptions>
    <componentModel:SortDescription PropertyName="Location" />
    <componentModel:SortDescription PropertyName="Description" />
</CollectionViewSource.SortDescriptions>
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Location" />
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

OverviewControl中的FilterText依赖项属性:

public string FilterText
{
    get => (string)GetValue(FilterTextProperty);
    set => SetValue(FilterTextProperty, value);
}

public static readonly DependencyProperty FilterTextProperty =
    DependencyProperty.Register(nameof(FilterText), typeof(string), 
    typeof(ProfileOverviewControl), new FrameworkPropertyMetadata(OnFilterTextChanged));

private static void OnFilterTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
     var intanceOfThisClass = (ProfileOverviewControl)d;
        if (_collectionViewSource == null) 
        _collectionViewSource = intanceOfThisClass.FindResource("GroupedProfiles") as CollectionViewSource;
     _collectionViewSource?.View?.Refresh();
}

OnFilterEvent方法:

    private void GroupedProfiles_OnFilter(object sender, FilterEventArgs e)
    {
        e.Accepted = string.IsNullOrEmpty(FilterText) || e.Item.ToString().Contains(FilterText);
    }

问题

如您在FilterText的绑定中所看到的,我有5000ms的延迟。出于测试目的,我将其设置为5000ms,而不是合理的500ms。 为了使过滤器正常工作,我需要刷新CollectionView。 但是,PropertyChangedCallback在每次更改后立即触发,而不是通过延迟绑定对其进行限制。

我不太了解这种行为。如果这只是延迟绑定的工作方式,那么是否有其他方法可以限制CollectionView刷新?

1 个答案:

答案 0 :(得分:3)

尝试像这样反转绑定。这样,延迟将在文本框中更改。现在,延迟取决于滤镜属性的更改(如果从OverviewControl中更改)。

value_t