【问题标题】:Binding/setting property on 'parent' item in HierarchicalDataTemplateHierarchicalDataTemplate 中“父”项的绑定/设置属性
【发布时间】:2018-03-28 21:16:27
【问题描述】:

我在 WPF 中有一个菜单,我正在尝试使用绑定和 HierarchicalDataTemplate 动态构建它:

        <Menu ItemsSource="{Binding MenuItems}">
            <Menu.ItemContainerStyle>
                <Style>
                    <Setter Property="cal:Message.Attach" Value="Click()" />
                </Style>
            </Menu.ItemContainerStyle>
            <Menu.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding MenuItems}">
                    <TextBlock Text="{Binding Name}" cal:Message.Attach="Click()" Background="Transparent"/>
                </HierarchicalDataTemplate>
            </Menu.ItemTemplate>
        </Menu>

IMenuItem 有一个Click 方法、一个'sub'MenuItems 的集合,以及一个显示在文本块中的Name

在我尝试让Click 工作之前一切正常。由于点击事件是在模板创建的MenuItem 上触发的,因此我无法访问它来将我的 Caliburn 操作与cal:Message.Attach="Click()" 绑定。

我尝试通过在 ItemContainerStyle 中使用 setter 来添加操作。

它似乎有效,但是我在多个地方触发了点击事件:

例如,如果我点击“测试 2”:

“测试 2”模型“数据管理器”模型上的点击事件都会被触发。

【问题讨论】:

    标签: wpf caliburn.micro


    【解决方案1】:

    鼠标点击是冒泡事件。在菜单和树视图等分层控件中,子项是父项的可视子项,因此冒泡事件将沿着树向上追踪,直到到达根项。你需要设置 e.Handled = true 来阻止它冒泡。

    【讨论】:

    • 嗯,我使用的是 Caliburn Actions,而不是 WPF 事件,但是它们似乎执行相同的冒泡行为(但在 ViewModels 中寻找相同命名的方法)-问题是我似乎不能找到与e.Handled 等效的内容。我有一个与事件监听器有关的工作,但我讨厌在我的代码隐藏中包含任何东西。
    • @Joe 我不使用那个 MVVM 框架,但看起来他们有一种干净的方式来传递 eventargs:caliburnmicro.com/documentation/actions 在你的 XAML 中你可以指定 $eventargs。
    猜你喜欢
    • 2011-03-16
    • 2016-04-04
    • 2017-02-12
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2012-07-03
    相关资源
    最近更新 更多