XAML绑定自定义CollectionViewSource Filter

时间:2015-01-23 21:32:29

标签: c# wpf xaml binding

我正在尝试按单位在单独的列中显示记录列表。除了按单位过滤的绑定外,一切正常。

我可能会以完全错误的方式解决这个问题,但这就是我所拥有的。

public class Record : INotifyPropertyChanged
{
    public string Name { get; set; }
    public string Unit { get; set; }
}
public class UnitList
{
    public ObservableCollection<Record> Items { get; set; }
}

我正在使用此标记扩展代码进行过滤。 In WPF can you filter a CollectionViewSource without code behind?

我可以静态设置PropertyFilter值并且过滤得很好,但是所有列都给出了相同的值。 tbUnitName显示Unit的正确值,但我无法获得传递给PropertyFilter值的相同值我尝试了ProxyElement / FrameworkElement绑定技巧以及尽可能多的绑定到父元素的不同组合但是我仍然在过滤器代码中得到'null'。

在窗口代码隐藏中我得到了:

List<string> names = (from s in this.SelectedSheets.Items
                     where !string.IsNullOrWhiteSpace(s.Unit)
                     select s.Unit).Distinct().ToList();
UnitNames = new ObservableCollection<string>(names);
lbUnits.ItemsSource = UnitNames;

这是XAML:

<ListBox Name="lbUnits" >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Name="spRoster" Orientation="Horizontal" CanHorizontallyScroll="True" CanVerticallyScroll="False" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBox x:Name="tbUnitName" Text="{Binding Path=.}" />
                <ListBox ItemsSource="{Binding }" ItemTemplate="{StaticResource listItemTemplate}" Margin="0,20,0,0" Name="lb1" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="150" ScrollViewer.CanContentScroll="False" >
                    <ListBox.DataContext>
                        <CollectionViewSource Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=Items}" >
                            <!--Filter="FilterOutB"-->
                            <CollectionViewSource.Filter>
                                <local:Filter>
                                    <local:PropertyFilter PropertyName="Unit" Value="{Binding Path=.}" />
                                </local:Filter>
                            </CollectionViewSource.Filter>
                        </CollectionViewSource>
                    </ListBox.DataContext>
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel MaxWidth="{Binding ActualWidth, ElementName=lb1}" />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我想我已经解决了。我添加了

<Grid.Resources>
      <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</Grid.Resources>

并将过滤器更改为

<local:PropertyFilter PropertyName="Unit" Value="{Binding  Source={StaticResource proxy}}" />

0 个答案:

没有答案