【问题标题】:how to add\remove multiple items from one listview to another in MVVM using wpf?如何使用 wpf 在 MVVM 中将多个项目从一个列表视图添加到另一个列表视图?
【发布时间】:2012-12-26 18:05:39
【问题描述】:

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

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 访问和修改元素。”

【问题讨论】:

  • 你有什么问题?
  • 关于实施的任何想法?

标签: wpf mvvm


【解决方案1】:

您提到您正在使用 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(它们是 ListView1ListView2 绑定到的 ItemSource必须是 ObservableCollection 才能看到更新在用户界面中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2020-12-30
    相关资源
    最近更新 更多