将MouseBindings添加到数据绑定WPF ListView中的项目

Mic*_*nne 3 data-binding wpf listview mvvm icommand

当用户点击ListView中的项目时,我正在尝试在我的ViewModel中执行命令.当我添加ListViewItem在XAML我可以再补充一个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>
Run Code Online (Sandbox Code Playgroud)

但是如何在数据绑定ListView中实现这一目标?

<ListView ItemsSource="{Binding Patients}">
<ListView.View>
    <GridView>
        <GridViewColumn Header="Test" />
    </GridView>
    <!-- How to set the MouseBinding for the generated ListViewItems?? -->
</ListView.View>
Run Code Online (Sandbox Code Playgroud)

我已经通过定义ListViewItem样式和替换它ControlTempalte来获得解决方案ListViewItem.虽然,我希望有一个更容易的解决方案.

真诚的,迈克尔

Ray*_*rns 5

使用样式替换ControlTemplateon ListViewItem不是一个糟糕的解决方案.事实上,它可能是我的第一选择.

完成同一种类型的另一种方法是在您的ListViewItem样式上使用自定义附加属性:

<Style TargetType="ListViewItem">
  <Setter Property="local:AddToInputBinding.Binding">
    <Setter.Value>
      <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />    
    </Setter.Value>
  </Setter>
  ...
Run Code Online (Sandbox Code Playgroud)

为此,您需要创建MyBindingHandler.AddBinding附加属性:

public class AddToInputBinding
{
  public static InputBinding GetBinding(... // create using propa snippet
  public static void SetBinding(...
  public static readonly DependencyProperty BindingProperty = DependencyProperty.RegisterAttached(
    "Binding", typeof(InputBinding), typeof(AddToInputBinding), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      ((UIElement)obj).InputBindings.Add((InputBinding)e.NewValue);
    }
  }));
}
Run Code Online (Sandbox Code Playgroud)

这可以扩展为处理多个绑定,但你明白了:这个类允许你在任何样式中添加一个InputBinding.

此解决方案可能比您正在执行的操作更受欢迎,因为DoubleClick绑定直接在ListBoxItem上定义,而不是在其模板内的另一个控件上定义.但我认为这主要归结为个人偏好.