Как передать CollectionViewSource в конвертер? - PullRequest
1 голос
/ 16 мая 2019

У меня есть что-то вроде этого:

<UserControl.Resources>
    <ResourceDictionary>
        <CollectionViewSource x:Key="filteredSymbols" Source="{Binding Symbols ,RelativeSource={RelativeSource AncestorType=UserControl}}" 
                              Filter="Symbols_CollectionViewSource_Filter" IsLiveFilteringRequested="True" >
            <CollectionViewSource.LiveFilteringProperties>
                <sys:String>DisplayPage</sys:String>
            </CollectionViewSource.LiveFilteringProperties>
        </CollectionViewSource>
    </ResourceDictionary>
</UserControl.Resources>

...

<Border Background="{Binding Source={StaticResource filteredSymbols}, Converter={StaticResource MultiThresholdToReturnValueConverter}}" >

Я пытаюсь передать ListCollectionView конвертеру в свойстве background border, но он будет проходить нулевое значение.

Я также пытался добавить Path=. к фоновой привязке границы, но без разницы.

Я что-то упустил?


Изменить:

Я только что попробовал идентичное связывание на ListView ItemsSource, и оно прекрасно передаст объект ListCollectionView в преобразователь, используя этот код:

<ListView ItemsSource="{Binding Source={StaticResource filteredSymbols}, , Converter={StaticResource MultiThresholdToReturnValueConverter}}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="item" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Что происходит?

1 Ответ

1 голос
/ 16 мая 2019

Я нашел способ обойти эту проблему, установив для ресурса значение DependencyProperty в коде и привязав его к этому, как показано ниже:

Код:

...

public static readonly DependencyProperty FilteredSymbolsProperty = DependencyProperty.Register(nameof(FilteredSymbols), typeof(CollectionViewSource), typeof(SymbolSummaryControl));
public CollectionViewSource FilteredSymbols
{
    set { SetValue(FilteredSymbolsProperty, value); }
    get { return (CollectionViewSource)GetValue(FilteredSymbolsProperty); }
 }

public ctor()
{
    InitializeComponent();

    FilteredSymbols = (CollectionViewSource)this.Resources["filteredSymbols"];
    Debug.Assert(FilteredSymbols != null);
}

...

А затем с помощью привязки:

Background="{Binding Path=FilteredSymbols.View, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource MultiThresholdToReturnValueConverter}}"
...