向数据绑定WPF ListView中的项添加鼠标绑定

向数据绑定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&

当用户单击ListView中的项目时,我试图在ViewModel中执行一个命令。当我在XAML中添加一个
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>