2012-01-13 71 views
0
 <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,我应该怎么做?如何在ItemContainerStyle中使用EventToCommand?

+0

可以提供约'EventToCommand'功能一些更多的信息? – stukselbax 2012-01-13 07:10:03

+0

@stukselbax:正如其中一个标签所暗示的那样,它是mvvm-light中的一个类。 – CuiPengFei 2012-01-13 07:22:27

+0

也许这个问答很有帮助:http://stackoverflow.com/questions/1878362/mvvmlight-eventtocommand-and-wpftoolkit-datagrid-double-click – Clemens 2012-01-13 09:02:26

回答

0

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

如果你有一个doubleclick事件钩子。如果不可用,则使用(预览)mousedown并检查命令参数中的clickCount。 2的ClickCount对应于双击。

请注意:我有我自己的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 
    } 
} 
-2

这样做的最好方法是只使用在代码隐藏中编写的普通事件处理程序。如果需要,这可以转发到模型或视图模型上的方法或命令。

像使用EventToCommand行为这样的窍门只会让你更加复杂的XAML和一个相当高的风险,你会泄漏内存。 (发生这种情况是因为EventToCommand即使不应该也会侦听CanExecuteChanged事件。)