如何使用wpf在MVVM中添加\从一个列表视图中删除多个项目到另一个

时间:2012-12-26 06:18:17

标签: wpf mvvm

我有两个列表视图。其中一个是左手边,另一个是右手边。我有两个按钮来添加和删除两个列表视图中的项目。

LHSListview绑定到List并且RHSListview绑定到List。列类有两个变量'order'和'Id'。

当我点击添加按钮时,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修改元素。”

1 个答案:

答案 0 :(得分:0)

您提到您正在使用MVVM,因此您可能知道不应该从视图中的ListViews更改项目。您应该做的是修改您在ViewModel中绑定的集合。

问题是在MVVM中获取多个选择有点棘手,因为SelectedItems属性不是依赖属性。

有两种方法可以实现你所追求的目标,都支持MVVM:
更简单的方法是在View的CodeBehind中监听Button_Click,创建所选项目的新列表,并将其传递给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);
 }

查看模型(在我的班级中我称之为MainVM)

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

就是这样。请记住,List1和List2(ItemSourceListView1绑定的ListView2 必须 { {1}}在UI中查看更新。

我还承诺了一个更长的选项,因为看到关于这个主题的3部分博文: