向数据绑定WPF ListView中的项添加鼠标绑定
当用户单击ListView中的项目时,我试图在ViewModel中执行一个命令。当我在XAML中添加一个向数据绑定WPF ListView中的项添加鼠标绑定,wpf,data-binding,listview,mvvm,icommand,Wpf,Data Binding,Listview,Mvvm,Icommand,当用户单击ListView中的项目时,我试图在ViewModel中执行一个命令。当我在XAML中添加一个ListViewItem时,我可以将一个MouseBinding添加到它的InputBindings <ListView> <ListView.View> <GridView> <GridViewColumn Header="Test" /> </GridView> </ListView.View&
ListViewItem
时,我可以将一个MouseBinding
添加到它的InputBindings
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Test" />
</GridView>
</ListView.View>
<ListViewItem Content="Item 1" >
<ListViewItem.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
</ListViewItem.InputBindings>
</ListViewItem>
</ListView>
但如何在数据绑定的ListView中实现这一点呢
<ListView ItemsSource="{Binding Patients}">
<ListView.View>
<GridView>
<GridViewColumn Header="Test" />
</GridView>
<!-- How to set the MouseBinding for the generated ListViewItems?? -->
</ListView.View>
通过定义ListViewItem
样式并替换ListViewItem
的ControlTempalte
,我已经找到了一个解决方案。不过,我希望有一个更简单的解决办法
真诚地,
Michael使用样式替换
ListViewItem
上的ControlTemplate
不是一个好的解决方案。事实上,这可能是我的第一选择
实现相同类型的另一种方法是在ListViewItem
样式上使用自定义附加属性:
<Style TargetType="ListViewItem">
<Setter Property="local:AddToInputBinding.Binding">
<Setter.Value>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
</Setter.Value>
</Setter>
...
这个类可以扩展为处理多个绑定,但是您得到了一个想法:这个类允许您在任何样式中添加InputBinding
此解决方案可能比您正在执行的操作更可取,因为双击绑定直接在ListBoxItem上定义,而不是在其模板内的另一个控件上定义。但我认为这主要取决于个人偏好。我可以通过以下方式解决这个问题: 1) 我添加了对
System.Windows.Interactivity
DLL的引用(在C:\Program Files(x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries
中找到)
2) 将此添加到我的XAML文件:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
3) 在我的ListView中添加了以下内容:
<ListView ...>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{x:Static local:MainWindow.RoutedCommandEditSelectedRecordWindow}" />
</i:EventTrigger>
</i:Interaction.Triggers>
...
</ListView>
...
您是否查看了此帖子?查看social.msdn上的这篇文章:我尝试了你的解决方案,但没有成功。首先,我认为GetBinding()和SetBinding()应该是静态的(如果不是,则不会编译),其次,当我试图从样式中使用它时,总是会出现错误“无法将属性'Property'中的值转换为'System.Windows.DependencyProperty'类型的对象”。当我没有把它放在一个样式中时,它就工作了。我想也许你没有使用propa代码段。如果你有,它会为你设置“静态”。此外,propa应该通过正确设置DependencyProperty
来解决您的其他问题。您是否将第三个参数设置为RegisterAttached
?在WPF 3.5中,MouseBinding的Command属性不是DependencyProperty,因此此代码被截断将无法工作。这在我使用atm的WPF4.0中是固定的。请参阅:AddToInputBinding
的一个问题是Style
s在第一次应用时就被冻结,因此每个ListViewItem
都会绑定到来自第一个项的viewmodel的命令。。。
<ListView ...>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{x:Static local:MainWindow.RoutedCommandEditSelectedRecordWindow}" />
</i:EventTrigger>
</i:Interaction.Triggers>
...
</ListView>