我有两个列表视图。其中一个是左手边,另一个是右手边。我有两个按钮来添加和删除两个列表视图中的项目。
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修改元素。”
答案 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(ItemSource
和ListView1
绑定的ListView2
, 必须 { {1}}在UI中查看更新。
我还承诺了一个更长的选项,因为看到关于这个主题的3部分博文: