2011-08-28 86 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