Silverlight 4 EventTrigger Handled



我的应用程序中有两个嵌套的Grid (FrameworkElement)项。

<UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">        
<Grid x:name="OuterGrid">
          <i:Interaction.Triggers>
          <i:EventTrigger EventName="MouseLeftButtonDown">
           <i:InvokeCommandAction x:Name="TheOuterCommand" Command="{Binding OuterCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
            <Grid x:name="InnerGrid">
             <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonDown">
                    <i:InvokeCommandAction x:Name="TheInnerCommand" Command="{Binding InnerCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
        </Grid>
    </Grid>
</UserControl>

每个invokecommand都附加到视图模型中的DelegateCommand(来自Prism库)。

OuterCommand = new DelegateCommand(OuterCommandMethod, e => true);
InnerCommand = new DelegateCommand(InnerCommandMethod, e => true);

目前, inergrid 上的EventTrigger也会触发OuterGrid上的事件,因为MouseLeftButtonEvent未在 inergrid 级别处理。

是否有一种方法,我可以通知EventTrigger,它被处理,它不应该冒泡到OuterGrid?

目前,我所能想到的就是在InnerGrid周围有一个包装器FrameworkElement,它使用XAML代码上的事件来设置要处理的事件。还有人有其他的想法吗?

---- Edit ----最后,我在我的应用程序中包含了MVVM Light,并用RelayCommand替换了InvokeCommandAction。这是现在工作如我所愿。我会把科比的答案标记为给我建议的赢家。

我们通过添加名为IsInner的依赖属性来扩展EventTrigger,然后我们总是在内部EventTrigger中设置静态标志。外部EventTrigger取消标志设置,如果标志设置了,则返回。这是非常容易编写和运行良好。

最好的方法是将事件参数传递给Command,然后标记使用事件参数处理的事件。您可以按照下面的示例进行操作。

相关内容

  • 没有找到相关文章

最新更新