0

我有两个列表视图。一个在左侧,另一个在右侧。我有两个按钮可以从两个列表视图中添加和删除项目。

LHSListview 绑定到 List,RHSListview 绑定到 List。Column 类有两个变量“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 访问和修改元素。”

4

1 回答 1

0

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

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

有两种方法可以实现您所追求的,都支持 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);
 }

查看模型(在我的课堂上我称之为 MainVM)

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

就是这样。请记住,List1 和 List2 (它们是ItemSource那个ListView1ListView2绑定到的,必须是 ObservableCollection在 UI 中看到更新。

我也承诺提供更长的选择,请参阅关于该主题的 3 部分博客文章:

于 2012-12-26T10:05:39.820 回答