防止子元素的事件以 MVVM 方式冒泡到它的父元素
Prevent child element's event from bubbling up to it's parent in MVVM way
我有一个带有子按钮的 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>
可以看到,MouseDown
和Click
我都试过了,处理事件,如下:
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-based 代码,无 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(包括)的行为是在选择项目时折叠。
如果您不需要这个,但需要一个明确的、独立于用户的操作来折叠列表,那么使用另一个元素或它们的组合。
在我看来,具有嵌套 ListBox 的扩展器最适合您的任务。
我有一个带有子按钮的 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>
可以看到,MouseDown
和Click
我都试过了,处理事件,如下:
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-based 代码,无 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(包括)的行为是在选择项目时折叠。
如果您不需要这个,但需要一个明确的、独立于用户的操作来折叠列表,那么使用另一个元素或它们的组合。
在我看来,具有嵌套 ListBox 的扩展器最适合您的任务。