如何在ItemContainerStyle中使用EventToCommand?

时间:2012-01-13 06:45:28

标签: wpf mvvm mvvm-light relaycommand itemcontainerstyle

        <ListBox Grid.Row="1" ItemsSource="{Binding Source}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" DisplayMemberPath="Name">
        <ListBox.ItemContainerStyle>
            <Style>
                <EventSetter Event="ListBoxItem.MouseDoubleClick" Handler="DoubleClick" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>

这就是它现在的运作方式。 如果我想将每个ListBoxItem的DoubleClick事件绑定到RelayCommand,我该怎么办?

2 个答案:

答案 0 :(得分:0)

这是我使用MVVMLight EventToCommand功能的方式。

如果你有一个doubleclick事件挂钩。如果不可用,请执行(预览)mousedown并检查命令args中的clickCount。 ClickCount为2对应双击。

请注意:我有自己的RelayCommand实施。 MVMMLight工具包中的那个可能看起来不同。

<强> XAML:

<interactivity:Interaction.Triggers>
    <interactivity:EventTrigger EventName="MouseDown">
        <mvvmLight:EventToCommand PassEventArgsToCommand="True" Command="{Binding MouseDownCommand}"></mvvmLight:EventToCommand>
    </interactivity:EventTrigger>
</interactivity:Interaction.Triggers>

<强>视图模型:

public ICommand MouseDownCommand
{
  get
  {
    if (_mouseDownCommand == null)
    {
      _mouseDownCommand = new RelayCommand(x => MouseDown(x as MouseButtonEventArgs));
    }
    return _mouseDownCommand;
  }
}

private void MouseDown(MouseButtonEventArgs e)
{
  if (e.ClickCount == 2)
  {
    // do stuff
  }
}

答案 1 :(得分:-2)

执行此操作的最佳方法是使用在代码隐藏中编写的普通事件处理程序。如果需要,可以转发到模型或视图模型上的方法或命令。

使用EventToCommand行为这样的技巧只会让您在更复杂的XAML方面付出代价,并且存在泄漏内存的高风险。 (这是因为EventToCommand监听CanExecuteChanged事件,即使它不应该。)