2014-12-01 39 views
0

我有一个ListBox的WPF模板,其中每个ListBoxItem包含一个按钮。Wpf条件PreviewMouseDown

ListBoxItem处理一个PreviewMouseDown事件。 ListBoxItem中的按钮有一个单击事件。我用Caliburn.Micro使用MVVM。

我想要发生的是PreviewMouseDown在用户点击按钮时被ListBoxItem忽略。根据我对PreviewMouseDown“Tunnels Down”的理解,而不是Bubbling Up,没有办法在按钮级别的Visual Tree上捕获该事件。而且,由于事件是在ViewModel中处理的,我想避免使用“如果UIElement是一个按钮,忽略PreviewMouseDown”这样的逻辑,因为这会预设某种类型的视图。

有没有办法让ListBoxItem有条件地执行PreviewMouseDown只有当用户没有点击按钮?

编辑:(我使用CAL:Message.Attach在信息查看ListBoxItem的一个命令连接到桌面视图模型的方法,所以没有后面的代码)

+0

为什么你在第一个项目上有一个PreviewMouseDown?如果你使用MVVM,你理论上应该没有代码隐藏,这就是为什么我要问。 – toadflakz 2014-12-01 16:18:35

+0

我可能说得很糟糕。我使用cal:Message.Attach命令附加到虚拟机上的方法,如下所示: cal:Message.Attach =“[Event PreviewMouseDown] = [Action MyFirstMethod($ dataContext)]; [Event PreviewMouseUp] = [动作MySecondMethod()] (想想吧,我还需要阻止PreviewMouseUp!) 所以,没有代码隐藏 – Sean 2014-12-01 16:29:38

+0

如果你没有反模式的问题,你可以通过$ eventArgs到您的ViewModel并将其标记为Handled = true; – 2014-12-02 13:55:51

回答

0

尝试以下操作:创建一个行为并将其附加到Xaml中的ListBox-Control。行为寄存到ListBox的预览事件中。在注册的EventHandler中设置e.Handled事件为true。

如果您有权访问ListBoxItem,也可以直接将行为附加到这些项目。