10

さまざまなフィルタリング要件を持つダイアログ ビュー モデルで CollectionViewSource を使用していますが、これは正常に機能します。また、プロパティ (SelectedProject) で選択したアイテムと同等のものを維持しています。ビューは現在のアイテムを認識しているため、それを廃止できるかどうか、または廃止すべきかどうか疑問に思っています。私のデータバインディングは次のようになります:

<ListView  
      ItemsSource="{Binding Projects.View}" 
      IsSynchronizedWithCurrentItem="True"
      SelectedItem="{Binding SelectedProject, Mode=TwoWay}">

単体テストを容易にするために SelectedProject のセッターを使用していますが、私が見る限り、CurrentItem は設定できないようです。また、使用したいときに適切なオブジェクトにキャストする必要があります。OTOH、 SelectedProject が冗長な場合は、他の冗長性と同じように尊重して削除します。

では、通常、CollectionViewSource を使用しているときに、現在のアイテムをどのように処理するのでしょうか?

4

3 に答える 3

7

SelectedProject を廃止することもできますが、私は反対します。コードにプロパティがある場合、何をしているのかは明らかです。持っていない場合は、次のようなことをする必要があります

CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project

現在のプロジェクトと対話するためだけに。私は「組み込み」よりも明快さを重視しています。その上、CurrentItem は読み取り専用であるため、ViewModel でアイテムを選択したい場合でも、それは不可能です。

于 2010-02-28T15:03:44.747 に答える
1

私の場合、ItemsSource が CollectionViewSource にバインドされている ListBox に SelectedItem を設定しようとしていました。ListBox.SelectedItem ではなく、CollectionViewSource で現在のアイテムを設定する必要があるため、面倒です。そのため、シナリオでこれを処理する拡張メソッドを作成しました。

YourListBox.SetCurrentItemOnView<YourObjectType>(item);

...そして拡張メソッドの定義

public static void SetCurrentItemOnView<T>(this System.Windows.Controls.ListBox listBox, T item) where T : YourObjectType
{
    var view = listBox.ItemsSource as ListCollectionView;
    if (view == null) { return; }

    var itemToSelect = (from p in view.SourceCollection.OfType<T>()
                        where p.ID == item.ID
                        select p).FirstOrDefault();

    view.MoveCurrentTo(itemToSelect);
}

私の場合、アイテム参照がItemsSourceに含まれるアイテム参照と同じではなかったため、これは私にとって問題だったと思います。そのため、このように解決する必要がありました。

于 2013-09-18T21:43:48.713 に答える
1

ListView の SelectedItem は ItemsSource から独立していることを理解する必要があります。CollectionViewSource、List、Array のいずれを使用する場合でも、選択されたアイテムは常にそのコレクションのアイテムを表します。

SelectedProject が設定されていない理由についての質問に答えるには、セッター機能のエラーを確認することをお勧めします。バインディングにエラーが含まれているかどうかを確認する良い方法は、デバッグ中にバインディング エラー メッセージの出力を確認することです。

注: SelectedProject が Projects CollectionViewSource の項目と同じタイプの場合、使用前にキャストする必要はありません (オブジェクト タイプの SelectedProject を作成していない限り、設定の問題も説明されます)。

編集:申し訳ありませんが、短い答えはノーです。冗長ではありません。テストを念頭に置いている場合、変数を現在のアイテムにバインドすることは冗長ではありません。SelectedItem良い例は、古いバージョンのを新しいバージョンでテストする場合です。CollectionViewSourceののみを参照する場合SelectedItem、比較するには遅すぎる可能性がありますが、独自の変数を使用すると、再度設定する前にロジックをテストできます。

于 2010-02-28T05:38:02.543 に答える