0

私は2つのリストビューを持っています。左側に 1 つ、右側にもう 1 つ。2 つのリストビューに項目を追加および削除するための 2 つのボタンがあります。

LHSListview は List にバインドされ、RHSListview は List にバインドされます。列クラスには、'order' と 'Id' の 2 つの変数があります。

追加ボタンをクリックすると、LHSListview から選択したすべての項目が RHSListview に移動する必要があります。削除ボタンをクリックすると、その逆になります。

これは、追加ボタンのクリックで私がやろうとしていることです

var list1 = new ArrayList(lstAllFields.SelectedItems);
            foreach (var item in list1)
            {
                lstAllFields.Items.Remove(item);
                SelectedFields.Items.Add(item);
            }

しかし、これにより、lstAllFields.Items.Remove(item);この行に「ItemsSource が使用されている間、操作は無効です。代わりに、ItemsControl.ItemsSource を使用して要素にアクセスし、変更してください。」というエラーがスローされます。

4

1 に答える 1

0

MVVM を使用しているとのことでしたので、ビュー内の ListViews からアイテムを変更してはならないことはおそらくご存知でしょう。あなたがすべきことは、ViewModel でバインドされているコレクションを変更することです。

SelectedItems問題は、プロパティが依存関係プロパティではないため、MVVM で複数の選択を取得するのがちょっと難しいことです。

目的を達成する方法は 2 つあります。どちらも MVVM をサポートしています。
短くて簡単な方法はButton_Click、View の CodeBehind でリッスンし、選択した項目の新しいリストを作成し、それを VM に渡してロジックを実行することです。アイテムの追加と削除。

したがって、短いバージョンは次のようになります。

コードビハインド:

private void MyButton_OnClick(object sender, RoutedEventArgs e)
{
   List<MyObject> mySelectedItems = new List<MyObject>();

   foreach (MyObject item in listview1.SelectedItems)
   {
       mySelectedItems.Add(item);
   }

   (this.DataContext as MainVM).MoveMethod(mySelectedItems);
 }

View Model (私のクラスでは MainVM と呼んでいました)

public void MoveMethod(List<MyObject> selected)
{
   foreach (var item in selected)
   {
      List1.Remove(item);
      List2.Add(item);
    }
}

それでおしまい。UI で更新を確認するには、List1 と List2 (これはとバインド先ItemSourceのである必要があります) を覚えておいてください。ListView1ListView2 ObservableCollection

より長いオプションも約束しました。これについては、このテーマに関する素晴らしい 3 部構成のブログ投稿を参照してください。

于 2012-12-26T10:05:39.820 に答える