Добавление привязок мыши к элементам в WPF ListView с привязкой к данным - PullRequest
3 голосов
/ 25 января 2010

Я пытаюсь выполнить команду в моей ViewModel, когда пользователь щелкает элемент в ListView. Когда я добавляю 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>

Но как этого добиться в ListView с привязкой к данным?

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

Я уже получил решение, определив стиль ListViewItem и заменив ControlTempalte на ListViewItem. Хотя, я надеюсь, что есть более простое решение.

С уважением, Michael

Ответы [ 2 ]

5 голосов
/ 26 января 2010

Замена ControlTemplate на ListViewItem с использованием стиля не является плохим решением. На самом деле, это был бы мой первый выбор.

Еще один способ сделать то же самое - использовать пользовательское свойство в вашем стиле ListViewItem:

<Style TargetType="ListViewItem">
  <Setter Property="local:AddToInputBinding.Binding">
    <Setter.Value>
      <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />    
    </Setter.Value>
  </Setter>
  ...

Для этого необходимо создать вложенное свойство 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);
    }
  }));
}

Это может быть расширено для обработки нескольких привязок, но вы поймете, что идея: Этот класс позволяет вам добавлять InputBinding внутри любого стиля.

Это решение может быть предпочтительнее, чем то, что вы делаете, потому что привязка DoubleClick определяется непосредственно в ListBoxItem, а не в другом элементе управления внутри его шаблона. Но я думаю, что это в основном сводится к личным предпочтениям.

1 голос
/ 04 января 2012

Я смог обойти это, выполнив следующие действия:

1) Я добавил ссылку на DLL-библиотеку System.Windows.Interactivity (нашел ее в 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>
...