【问题标题】:Preventing child Tap event from bubbling to parent ListView item using MVVM Interactions使用 MVVM 交互防止子 Tap 事件冒泡到父 ListView 项
【发布时间】:2014-01-09 03:09:20
【问题描述】:

在以下 XAML 中点击 StackPanel 将触发 MyCommand1MyCommand2

<phone:LongListSelector ItemsSource="{Binding SomeSource}">
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate >
            <Grid>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Tap">
                        <i:InvokeCommandAction Command="{Binding MyCommand1}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>

                <StackPanel >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Tap">
                            <i:InvokeCommandAction Command="{Binding MyCommand2}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>           

如何确保只触发MyCommand2,同时保持正确的 MVVM 样式?

【问题讨论】:

  • 尝试为 stackpanel 设置一些背景颜色。但不确定
  • 命令的婴儿车怎么样。你能处理来自命令婴儿车的事件参数吗?这样它就不会为Grid 触发
  • 你有一个 Grid 并且里面有一个空的 StackPanel。您正在尝试捕捉 Tap 事件,但您甚至没有显示任何内容。点击事件是如何触发的?当 StackPanel 或 Grid 中没有元素时,选项卡事件的原始来源是什么?我建议你改变你的设计。此外,向我们解释更多关于 Tap 所做的事情以及它来自哪里?
  • @devhedgehog,这只是一个例子......如果真的很重要,我可以在 StackPanel 和 Grid 上设置宽度、高度和背景,这样用户就可以看到它。但这不是这里的问题。问题是防止事件冒泡到父 UI 元素...
  • 你可以通过将handled设置为true来处理事件,它应该停止冒泡

标签: wpf xaml mvvm windows-phone-8


【解决方案1】:

解决方案是编写自己的EventTrigger 并从“System.Windows.Interactivity.EventTrigger”继承。这会产生以下类,然后您可以在 XAML 中将其用于命令绑定。

public class EventTriggerWithoutPropagation : System.Windows.Interactivity.EventTrigger
{
    protected override void OnEvent(System.EventArgs eventArgs)
    {
        var routedEventArgs = eventArgs as RoutedEventArgs;
        if (routedEventArgs != null)
            routedEventArgs.Handled = true;

        base.OnEvent(eventArgs);
    }
}

如果您正在为 Windows Phone 开发,请转换为 GestureEventArgs 而不是 RoutedEventArgs,因为后者没有 Handled 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多