C# 使用绑定监视ListView选择的更改

C# 使用绑定监视ListView选择的更改,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有一个项目列表视图,每次用户选择或取消选择一个项目时,我都希望运行一些代码,而不必求助于控件codebehind中的事件处理程序——所有操作都是在控件的datacontext设置为的视图中进行的 当ListView的选择模式为“Single”时,我可以简单地将“SelectedItem”绑定到视图中的属性,并观察该属性的更改事件发生的时间。但是,如果选择模式为“多重”,则行为完全不可靠。有时最后单击的项目会更改SelectedItem,有时则不会。当选择模式不是单一模式时,此Dependenc

我有一个项目列表视图,每次用户选择或取消选择一个项目时,我都希望运行一些代码,而不必求助于控件codebehind中的事件处理程序——所有操作都是在控件的datacontext设置为的视图中进行的

当ListView的选择模式为“Single”时,我可以简单地将“SelectedItem”绑定到视图中的属性,并观察该属性的更改事件发生的时间。但是,如果选择模式为“多重”,则行为完全不可靠。有时最后单击的项目会更改SelectedItem,有时则不会。当选择模式不是单一模式时,此DependencyProperty似乎是完全垃圾。我还可以如何使用绑定来跟踪对ListView的SelectedItems集合的更改

请注意,我没有使用Expression blend,所以我不会使用Interaction.Triggers或类似的库解决方案

<ListView ItemsSource="{Binding Path=Zones}"  
          SelectionMode="Multiple"
          SelectedItem="{Binding SelectedZone}">

看不到好文章中描述的任何其他方法

问题是,
SelectedItems
属性是只读的,因此不能进行数据索引


不幸的是,到目前为止,这是一个棘手的问题。

唯一的解决方案是将列表的ItemsTemplate包装在一个可以切换并具有命令绑定(如按钮)的控件中,然后将viewmodel绑定到该命令绑定。这是一个巨大的痛苦,需要使用HitTestVisibility进行黑客攻击,并将按钮的状态绑定到项目的选定状态,但它最终会起作用。

我不太理解这句话:“不必求助于控件代码隐藏中的事件处理程序”。那么,如果不依赖代码隐藏中的某个内容,您希望如何进行
数据绑定呢???@Tigran在WPF中,xaml文件(UI)有一个代码隐藏,它可以包含程序逻辑及其控件(如ListView.SelectionChanged事件)的事件处理程序。有一种称为MVVM模式的方法,它涉及到使用数据上下文和绑定,这样控件就可以直接绑定到对象模型,而不是使用以编程方式操纵属性的中介方法。因为我的控件以这种方式绑定到它的底层数据,所以在视图和控件的代码隐藏之间分割对这些底层数据所做的工作是一件非常痛苦的事情(而且不美观)。请尝试在ListView上关闭Virtualization。您是否看到,当您单击与当前所选项目位于同一屏幕上的项目时,您会得到与必须向下滚动到该项目时不同的结果。这听起来很奇怪,但我想尝试的是将ListView设置为单个,但将项目本身设置为可切换的(只是一个bool属性是manuallyselected)和一个基于isManuallySelected的XAML自定义表示,这样看起来和感觉上都像是一个多选项。@BalamBalam有趣的建议,但在我的例子中,这不可能是原因——我的ListView被拉伸以显示所有项目,通常小于10。项目本身是可切换的(它们是DataRowViews,第一列是绑定到listview中复选框的布尔值),但我的印象是您可以在DataTable中的单个单元格上放置属性监视。如果集合中的项有自己的对象模型,那么问题会简单得多,那么我可以只向其中添加一个绑定的“isSelected”属性并观察它。如果您的行数少于10行,则关闭虚拟化不会有什么影响。你试过了吗?你有ListView网格视图吗?在每次尝试自动化数据表之前,我都会创建一个ObservableCollection。我感谢搜索工作,但我已经阅读了那篇文章和其他一些文章,这也是我特别提到我不想使用任何库解决方案的部分原因。此解决方案包括添加附加属性库(我不想在项目代码库中包含这些属性),而且,它只是专门为同步两个不同ListView的SelectedItems集合而编写的,这使得它的代码非常专业化,与我当前的需要有些相似。还要注意,SelectedItems属性是只读的这一事实对我来说不是问题。我不需要通过绑定操作所选项目-真正的问题是SelectedItems属性没有公开集合中项目的propertychanged事件,所以这个绑定永远不会改变-SelectedItems集合在ListView的整个生命周期中都是不变的。@Alain:我重新检查了我提供的链接,在我看来(和以前一样)页面底部有一个链接,其中包含源代码。因此,运行它不需要一些外部库。只需重用解决方案中提供的类。我没有使用这个解决方案,但在几次之前检查过它。