0

ObservableCollections に支えられた MVVM WPF アプリケーションに複数の ListViews があります。

ListView ごとに「アイテムの削除」コンテキスト メニュー項目を実装しています。現在、ViewModel の同じオブジェクトにバインドされた各 ListView の SelectedItem があります。ただし、ObservableCollection から項目を削除するには、ListView の名前 (この場合は Wk01CECollection) が必要です。

    private void DeleteLO()
    {
        this.Wk01CECollection.Remove(SelectedCE);

    }

SelectedItem がメンバーである ListView を参照する方法はありますか? そのままでは、ListView ごとに個別の削除メソッドを接続する必要があります。

4

2 に答える 2

0

これはこれを達成するための「ベストプラクティス」の方法ではないと確信していますが、非常に簡単です。

ListView の選択した項目をパラメーターとしてコマンドに渡すことができます。

 <Button Content="Delete selected item" Command="{Binding DeleteCommand}" CommandParamenter="{Binding ElementName=SomeListView, Path=SelecteItem}" />

コレクションに存在しない場合でも、例外を取得せずに ObservableCollection からアイテムを削除しようとすることができるため、プライベートな Delete メソッドで、ViewModel にあるすべての ObservableCollections からそのアイテムを削除しようとすることができます。ここでは、アイテムが同時に 2 つのコレクションに存在することはできないと想定しています。そうでない場合、すべてのコレクションからアイテムを削除するため、私が言ったことは機能しません。これを行う場合は、削除する前に null を確認してください。null オブジェクトを削除しようとすると、例外が発生します。

private void DeleteLO(object listitem)
{
    if(listitem != null)
    {
        if(listitem as CollectionType1 != null) //cast your listitem to the appropiate type inside your collection
            this.Wk01CECollection.Remove(listitem);

        if(listitem as CollectionType2 != null) 
            this.Wk02CECollection.Remove(listitem);

        //etc.
    }
}

これらすべてに加えて、MVVM を使用している場合は、ViewModel がビューについて認識しないことが最善であるため、VM 内で ListView を参照すると、その原則が破られます。

于 2013-01-23T20:43:05.250 に答える