0

コードプロジェクトの記事http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspxから複数の項目を選択できるコントロールを取得しました。基本的に、2 つのリストボックスがあります。1つはすべてのアイテムから始まり、ユーザーがそれらのいくつかを選択すると、他のリストボックスに移動します。Control は、2 つのリストの 2 つの依存関係プロパティを定義します。最初にすべての項目を含むプロパティは AvailableItems です。コントロールの ControlTemplate で次のように使用されます。

<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>

プロジェクトでコントロールを次のように使用します。

<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>

CollectionViewSource にバインドし、Data_Filter というフィルター関数を定義して、AvailableItems をフィルター処理しようとしています。AllItems は List オブジェクトであり、文字列が含まれています。コントロールが初期化されると、Data_Filter が AllItems のすべてのアイテムに対して呼び出され、FilterEventArgs の受け入れられたプロパティが各アイテムに対して正しく設定されます。ただし、コントロールは Data_Filter を無視してすべてのアイテムを表示します。コントロールの実装では、ICollectionView オブジェクトは次のように定義されます。

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

これにより、コントロールがビューをスキップしているのではないかと疑われます。コントロールの実装でフィルタリングを実装しようとすることはできますが、これは良い解決策ではありません。助言がありますか?

4

1 に答える 1

0

あなたのコード スニペットを正しく読んでいれば、コレクション ビューは使用されていません。GetDefaultViewCollectionViewSource によって明示的に作成されたビューは返されません。

AvailableItemsSourceフィルタリングされたコレクション ビューを指定できるプロパティを提供するには、コントロールをリファクタリングする必要があるようです。内部ロジックは、既定のビューを作成する前に項目ソースを使用する必要があります。

アップデート

ここにあなたが試すことができる何かがあります:

ビューにバインドできる使用可能なアイテムのコレクションを公開するビュー モデルを定義します。ビュー モデルは、デフォルト コレクション ビューのフィルタリングを担当するようになりました。フィルタリングをトリガーする方法 (つまり、コマンドやプロパティ セッターなど) を決定する必要がありますが、この例のために、ビュー モデルのコンストラクターでフィルターを設定する方法を示します。

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

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

これが機能する理由は、CollectionViewSource.GetDefaultView(...)常に同じビューを返すためです。したがって、コントロールが常に既定のビューを要求し、ビュー モデルがそれにフィルターを追加している場合CollectionViewSource、XAML で明示的に を作成しなくても目的の効果が得られるはずです。

于 2011-08-29T05:56:20.270 に答える