微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

防止子元素的事件以 MVVM 方式冒泡到其父元素

如何解决防止子元素的事件以 MVVM 方式冒泡到其父元素

我有一个带有子按钮的 ComboBoxItem,我想防止 ComboBox 在单击该按钮时掉落(折叠)。显然,该按钮似乎将点击事件冒泡到 ComboBoxItem,导致下拉折叠。

<ComboBox DropDownopened="OnWindowsDropDownopened">
    <ComboBox.ItemTemplateSelector>
        <s:ComboBoxItemTemplateSelector>
            <s:ComboBoxItemTemplateSelector.SelectedTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Description}" />
                </DataTemplate>
            </s:ComboBoxItemTemplateSelector.SelectedTemplate>
            <s:ComboBoxItemTemplateSelector.DropDownTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                        <Button Command="{Binding DataContext.Highlightwindow,ElementName=Windows}" CommandParameter="{Binding}" MouseDown="Button_MouseDown" Click="Button_Click">
                            <md:PackIcon Kind="Target" />
                        </Button>
                        <TextBlock Text="{Binding Description}" />
                    </StackPanel>
                </DataTemplate>
            </s:ComboBoxItemTemplateSelector.DropDownTemplate>
        </s:ComboBoxItemTemplateSelector>
    </ComboBox.ItemTemplateSelector>
    <ComboBox.ItemContainerStyle>
        <Style BasedOn="{StaticResource MaterialDesignComboBoxItemStyle}" targettype="ComboBoxItem">
            <Setter Property="IsEnabled" Value="{Binding Valid}" />
            <Setter Property="ToolTip">
                <Setter.Value>
                    <TextBlock Text="{Binding Title}" />
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

如我们所见,我尝试了 MouseDownClick,处理事件,如下所示:

private void Button_Click(object sender,System.Windows.RoutedEventArgs e)
{
    e.Handled = true;
}

private void Button_MouseDown(object sender,MouseButtonEventArgs e)
{
    e.Handled = true;
}

我该怎么做?另外,是否可以仅使用 MVVM 代码(基于 XAML 的代码,没有 C#)?

Here's a screenshot of the ComboBox open

解决方法

您尚未测试过的 PreviewMouseLeftButtonDown 并通过 ComboBox 进行测试。或者您可以参加另一个 Preview* 活动。

private void Button_PreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e)
{
    e.Handled = sender is Button;
}

<ComboBox DropDownOpened="OnWindowsDropDownOpened" PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown">
,

在 WPF 中,元素是根据它们的行为而不是它们的视觉外观来选择的。
ComboBox(包括)的行为是在选择项目时折叠。
如果您不需要这个,但需要用户明确的、单独的操作来折叠列表,那么使用另一个元素或它们的组合。

在我看来,带有嵌套列表框的扩展器将最适合您的任务。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。