Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ViewModel中选择listview中的所有项目_C#_Wpf_Mvvm_Visual Studio 2012 - Fatal编程技术网

C# 从ViewModel中选择listview中的所有项目

C# 从ViewModel中选择listview中的所有项目,c#,wpf,mvvm,visual-studio-2012,C#,Wpf,Mvvm,Visual Studio 2012,我的WPF窗口上有一个ListView,我有一个按钮,可以选择all。首先,如何让按钮选择listview中的所有项目 其次,我需要我的ViewModel来浏览所有选定的项目。如何在ViewModel中获取此信息 我已经读过你可以用IsSelected属性来做这件事,但是有一个bug,本地属性会覆盖binding属性,因此如果它之前已经被选中,那么它就不会再次被选中——或者类似的东西。这似乎很复杂 然后我读了这个博客,它看起来也很复杂 我想知道它是否必须如此复杂,这些例子是唯一的前进之路 XAM

我的WPF窗口上有一个ListView,我有一个按钮,可以选择all。首先,如何让按钮选择listview中的所有项目

其次,我需要我的ViewModel来浏览所有选定的项目。如何在ViewModel中获取此信息

我已经读过你可以用IsSelected属性来做这件事,但是有一个bug,本地属性会覆盖binding属性,因此如果它之前已经被选中,那么它就不会再次被选中——或者类似的东西。这似乎很复杂

然后我读了这个博客,它看起来也很复杂

我想知道它是否必须如此复杂,这些例子是唯一的前进之路

XAML:


在按钮上附加一个处理程序-

<Button Click="Button_Click"/>

其次,如果视图中选择了所有项目,那么
ItemsSource
将始终等于
SelectedItems
。因此,在您的情况下,只需在ItemsSource(即
源)上迭代即可。

在按钮上附加一个处理程序-

<Button Click="Button_Click"/>

其次,如果视图中选择了所有项目,那么
ItemsSource
将始终等于
SelectedItems
。因此,在您的情况下,只需迭代ItemsSource,即
源。

我创建了一种行为,允许控件中的属性绑定到项集合的属性,其方式如下:

  • 如果更改控件中的属性,则会更新所有项
  • 如果更改项目中的属性,如果所有项目都具有相同的属性,则控件将反映该属性。如果不是,控件的属性将被赋予一个回退值(如null)
您可以使用此选项将CheckBox.IsChecked绑定到此类型的元素集合中类型为IsSelected的属性。
我向一个想做一些类似于你想要做的事情的人提出了这个建议,但是使用了数据网格。您可以查看一下。

我创建了一个行为,允许控件中的属性绑定到项集合的属性,其方式如下:

  • 如果更改控件中的属性,则会更新所有项
  • 如果更改项目中的属性,如果所有项目都具有相同的属性,则控件将反映该属性。如果不是,控件的属性将被赋予一个回退值(如null)
您可以使用此选项将CheckBox.IsChecked绑定到此类型的元素集合中类型为IsSelected的属性。
我向一个想做一些类似于你想要做的事情的人提出了这个建议,但是使用了数据网格。您可以查看一下。

我很久以前创建了一个附加行为来处理这个问题。它允许您将SelectedItems列表绑定到视图模型上的可观察集合,并处理来回的更改

使用附加行为是将功能扩展到现有控件(而不是将控件子类化)的首选方法,否则这些控件将需要扩展视图逻辑


我不会说您应该总是使用这种方法而不是将逻辑放在视图中。但这是一种简单的方法来捕获行为以便于重用。

我很久以前创建了一个附加的行为来处理这个问题。它允许您将SelectedItems列表绑定到视图模型上的可观察集合,并处理来回的更改

使用附加行为是将功能扩展到现有控件(而不是将控件子类化)的首选方法,否则这些控件将需要扩展视图逻辑


我不会说您应该总是使用这种方法而不是将逻辑放在视图中。但是,这是一种简单的方法来捕获行为,便于重复使用。

@RV1987谢谢你的回答,这肯定是其中的一个重要部分。然而,在剩下的时间里,我发现了这个博客,它详细介绍了如何使用源代码。绝对值得一读


谢谢你的回答,这肯定是其中很大的一部分。然而,在剩下的时间里,我发现了这个博客,它详细介绍了如何使用源代码。绝对值得一读


谢谢

为什么不
MVVM
?我们可以在代码隐藏中处理特定于视图的事情,但与业务相关的逻辑应该始终存在于ViewModel中。不是吗?MVVM纯粹主义者会告诉您,视图应该没有
MSDN
-
中的代码隐藏(构造函数之外)
代码隐藏可能包含实现可视化行为的UI逻辑代码。您不应该在需要进行单元测试的视图中放置任何逻辑代码。
@RV1987我同意特定于视图的代码可能存在于代码隐藏中。但是我有一个问题:如何处理ViewModel需要操纵选择的情况?我的意思是,根据ViewModel中定义的某些逻辑选择或取消选择项目?@HighCore-是的,我也支持MVVM模式,但这个答案仅参考OP的问题。在选择了ItemsSource始终等于selectedItems的所有项目后,他希望查看所有选定的项目。可能还有其他方法可以解决这个问题,但我只建议了简单的方法(不违反MVVM),为什么不
MVVM
?我们可以在代码隐藏中处理特定于视图的事情,但与业务相关的逻辑应该始终存在于ViewModel中。不是吗?MVVM纯粹主义者会告诉你视图不应该有cod
private void Button_Click(object sender, RoutedEventArgs e)
{
   sources_ListView.SelectAll();
}