【问题标题】:Stop Tunneling Event Trigger in WPF MVVM?在 WPF MVVM 中停止隧道事件触发器?
【发布时间】:2014-09-30 22:52:01
【问题描述】:

我想捕获 TabItem 选择更改事件,即仅当用户更改选项卡时才会调用 ViewModel 命令。我现在有这个,该命令被成功调用,但是更改的选择正在沿着可视树向下传输,因此更改的选择会在整个选项卡项中被捕获,而不仅仅是在用户更改选项卡时。有没有办法将触发器限制为仅选项卡更改?:

<TabControl Margin="10">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding CollapsedExpanderCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <TabItem Header="Account" >          
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>

【问题讨论】:

  • 我认为您必须传递事件参数并设置处理的属性。其他选项可能是尝试在 selectionchanged 后面的代码中设置 e.handled = true 并查看该命令是否也被触发。

标签: c# wpf mvvm


【解决方案1】:

如果您使用的是 MVVM,为什么不使用 SelectedItem 依赖属性并在 ViewModel 中绑定一个属性,例如:

<TabControl ItemsSource="{Binding Path=Items, Mode=OneWay}"
            SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}">
</TabControl>

【讨论】:

    【解决方案2】:

    通过在绑定到ICommand in myviewModel:TabItem 上使用PreviewMouseLeftButtonDown 事件触发器解决了这个问题

    <TabItem Header="Memberships" Margin="0,0,-5,-3" HorizontalAlignment="Right" >
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
                                <i:InvokeCommandAction Command="{Binding MembershipTabSelectedCommand}" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
    

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2014-12-28
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多