2012-01-31 45 views
0

监控的ListView选择更改我有一个项目的ListView,我想每一个用户选择或不诉诸事件处理程序在控件的代码隐藏取消选择项目时运行一些代码 - 一切都在视图正在做该控件将其datacontext设置为。使用绑定

当ListView控件的选择模式是“单次”我可以简单地“的SelectedItem”绑定到财产在我看来,并观察当属性的更改事件。但是,如果选择模式是“多个”,则行为完全不可靠。有时点击的最后一个项目会改变SelectedItem,有时它不会。当选择模式不单一时,此DependencyProperty似乎是完全垃圾。我还可以如何使用绑定来跟踪对ListView的SelectedItems集合的更改?

注意,所以我不会使用Interaction.Triggers或类似的库解决方案我不使用Expression Blend中。

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

真的不明白这句话:“没有诉诸控件的代码隐藏事件处理程序”。那么如果你不想在代码隐藏的东西上继承,你想如何创建一个'DataBinding'? – Tigran 2012-01-31 20:06:53

+0

@Tigran在WPF中,xaml文件(UI)具有代码隐藏功能,可以为其控件(如ListView.SelectionChanged事件)包含程序逻辑和事件处理程序。有一种称为MVVM模式的方法,它涉及使用datacontext和绑定,以便控件可以直接绑定到对象模型,而不是使用以编程方式操作属性的中间方法。因为我的控件以这种方式绑定到它的底层数据,所以在视图和代码隐藏控件之间分割在底层数据上完成的工作是一个巨大的痛苦(并且不雅)。 – Alain 2012-01-31 20:19:15

+0

尝试在ListView上关闭virtualiztion。您是否看到当您单击与当前选定项目位于同一屏幕上的项目时,如果您不得不向下滚动至该项目,则会得到不同的结果。这听起来很奇怪,但我想尝试的是使ListView单一,但使项目本身可切换(只是一个布尔属性手动选择)和基于isManuallySelected的XAML中的自定义演示文稿,因此它看起来和感觉像一个多选。 – Paparazzi 2012-01-31 22:59:40

回答

0

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

0

不要看那么this好文章描述的任何其他方式。

的事情是,unfrotunately,SelectedItems属性是只读的,所以不能databinded。

直到现在,这是一个棘手的故事,不幸的是。

+0

我很欣赏搜索工作,但我已阅读该文章以及其他一些文章,这部分是为什么我特别提到我不想使用任何库解决方案。此解决方案涉及添加一个附加属性库(我不想将其包含在项目代码库中),此外,它仅专门用于同步两个不同ListView的SelectedItems集合 - 使其具有高度专业化的代码,只是有点类似满足我目前的需求。 – Alain 2012-01-31 20:25:41

+0

另请注意,SelectedItems属性为只读的事实对我来说不是问题。我不需要通过绑定来操作选定的项目 - 真正的问题是SelectedItems属性不会公开集合中项目的属性changed事件,所以这个绑定永远不会改变 - SelectedItems集合在整个一个ListView。 – Alain 2012-01-31 20:27:38

+0

@Alain:我重新检查了我提供的链接,在我看来(和以前一样),页面底部有一个链接,其中包含** source **。所以你不需要一些外部库来运行它。只需重用解决方案中提供的类。我没有使用这个解决方案,但是很久以前就对它进行了检查。 – Tigran 2012-01-31 20:33:15