2011-08-28 61 views
0

我已经获得了一个控件,允许从codeproject文章http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspx中选择多个项目。基本上它有2个列表框。一个开始于所有项目,当用户选择其中一些时,他们移动到其他列表框。 Control为两个列表定义两个依赖项属性,最初包含所有项目的属性为AvailableItems。它是在控件的ControlTemplate中使用如下:通过绑定到CollectionViewSource和定义称为过滤功能WPF - CollectionViewSource Filter不工作

<Window.Resources> 
    <CollectionViewSource x:Key="multiSelectDataView" Source="{Binding ElementName=DocumentRoot, Path=AllItems}" Filter="Data_Filter" /> 
</Window.Resources> 

<UI:MultiSelectControl 
    x:Name="multiSelect" 
    Style="{StaticResource MultiSelectControlStyle}" 
    CurrentTitle="Group Components" 
    AvailableTitle="All Components" 
    AvailableItems="{Binding Source={StaticResource multiSelectDataView}}" 
    CurrentItems="{Binding SelectedItems, Mode=TwoWay}"> 
    <UI:MultiSelectControl.ObjectsTemplate> 
     <DataTemplate> 
     <TextBlock Text="{Binding}" /> 
     </DataTemplate> 
    </UI:MultiSelectControl.ObjectsTemplate> 
</UI:MultiSelectControl> 

我试图筛选AvailableItems:

<ListBox 
    Grid.Row="2" 
    Grid.Column="0" 
    SelectionMode="Extended" 
    x:Name="PART_AvailableListBox" 
    ItemsSource="{Binding AvailableItems}" 
    ItemTemplate="{TemplateBinding ObjectsTemplate}"> 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <EventSetter Event="MouseDoubleClick" Handler="AvailableListBoxItem_DoubleClick" /> 
    </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

我用的是控制在我的项目作为Data_Filter。 AllItems是一个List对象,它包含字符串。初始化控件时,将为AllItems中的每个项目调用Data_Filter,并为每个项目正确设置FilterEventArgs的接受属性。但是,控件会显示所有项目而不考虑Data_Filter。在控件的实现中,一个ICollectionView对象被定义为:

this.AvailableItemsCollectionView = 
       CollectionViewSource.GetDefaultView(this.AvailableItems); 

这让我很怀疑控件正在跳过我的视图。我可以尝试在控件的实现中实现过滤,但这不是一个好的解决方案。有什么建议么?

回答

0

如果我正确地阅读了您的代码片段,是的,您的收藏视图永远不会被使用; GetDefaultView不会返回由CollectionViewSource明确创建的任何视图。

它看起来像控件需要重构提供AvailableItemsSource属性,这将允许您指定过滤的集合视图。内部逻辑应该在创建默认视图之前使用项目源。

UPDATE

这里的东西,你可以尝试:

定义暴露出它可以在视图被绑定到现有项目集合视图模型。视图模型现在将负责过滤默认收集视图。您必须决定如何触发过滤,即通过命令或属性设置器等,但为了本示例的目的,我将在视图模型的构造函数中显示设置过滤器:

public class MyViewModel 
{ 
    public IList MyAvailableItems {...} 

    public MyViewModel() 
    { 
    var defaultView = CollectionViewSource.GetDefaultView(MyAvailableItems); 
    defaultView.Filter = ... 
    } 
} 

这应该起作用的原因是CollectionViewSource.GetDefaultView(...)始终返回相同的视图。因此,如果控件总是要求默认视图,并且视图模型已经为其添加了过滤器,则应该在没有在XAML中明确创建CollectionViewSource的情况下获得所需的效果。

+0

我知道,但如何以最少的改变来完成控制代码。我期待更详细的解决方案,只能通过检查我给出的链接中的控制代码来完成。 –

+0

根据您发布的代码,看起来好像不需要更改控制代码就可以完成,因为原始程序员正在请求默认集合视图,而没有其他选择。 – sellmeadog