【问题标题】:WPF combobox DataTemplate with button not clickable when combobox collapsed组合框折叠时,WPF组合框DataTemplate按钮不可点击
【发布时间】:2020-03-23 13:25:58
【问题描述】:

当组合框关闭时,如何使 ComboBox itemtemplate 中的按钮可点击?

我有一个用于一些静态选择的 WPF 用户控件,并在列表末尾有一个“自定义...”项,其中自定义项的 DataTemplate 有一个“编辑...”按钮。

该按钮在下拉列表中的项目中有效,但在所选值中无效。单击关闭的组合框会打开下拉菜单。或者 - 我可以在组合框关闭时隐藏“编辑...”按钮吗?

用于显示问题的简单测试应用程序 XAML。点击按钮开始动画,表明它有效。

<Window x:Class="UserControlInPanel.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:UserControlInPanel"
        Title="Test" Height="250" Width="400">
    <TabControl>
        <TabControl.Resources>
            <Storyboard x:Key="FlashOnOff">
                <DoubleAnimation Storyboard.TargetName="EditButton" 
                                 Storyboard.TargetProperty="Opacity"
                                 From="1" To="0"
                                 RepeatBehavior="1x"
                                 Duration="0:0:1">
                </DoubleAnimation>
                <DoubleAnimation Storyboard.TargetName="EditButton" 
                                 Storyboard.TargetProperty="Opacity"
                                 From="0" To="1"
                                 RepeatBehavior="1x"
                                 Duration="0:0:1">
                </DoubleAnimation>
            </Storyboard>
        </TabControl.Resources>
        <TabItem Header="Combobox Button">
            <StackPanel>
                <ComboBox x:Name="Selector" SelectedIndex="3" HorizontalContentAlignment="Stretch">
                    <ComboBox.Resources>
                        <DataTemplate DataType="{x:Type local:ViewModelItem}">
                            <Border BorderBrush="Black" BorderThickness="1">
                                <TextBlock Text="{Binding Text}" Margin="2"/>
                            </Border>
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type local:ViewModelCustom}">
                            <Border BorderBrush="Black" BorderThickness="1">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"></ColumnDefinition>
                                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="{Binding Text}" Margin="2"/>
                                    <Button x:Name="EditButton" Content="Edit..." Padding="4,0" Grid.Column="1">
                                        <Button.Triggers>
                                            <EventTrigger RoutedEvent="Button.Click">
                                                <BeginStoryboard Storyboard="{StaticResource FlashOnOff}">
                                                </BeginStoryboard>
                                            </EventTrigger>
                                        </Button.Triggers>
                                    </Button>
                                </Grid>
                            </Border>
                        </DataTemplate>
                    </ComboBox.Resources>

                    <ComboBox.Items>
                        <local:ViewModelItem Text="Predefined choice 1"></local:ViewModelItem>
                        <local:ViewModelItem Text="Predefined choice 2"></local:ViewModelItem>
                        <local:ViewModelItem Text="Predefined choice 3"></local:ViewModelItem>
                        <local:ViewModelCustom Text="Custom"></local:ViewModelCustom>
                    </ComboBox.Items>
                </ComboBox>
                <TextBox Text="{Binding ElementName=Selector, Path=SelectedIndex, StringFormat='{}{0}'}"></TextBox>
            </StackPanel>
        </TabItem>
    </TabControl>
</Window>

背后的代码:

namespace UserControlInPanel
{
    public class ViewModelItem
    {
        private String m_name = "";
        private String m_value = "";

        public string Name { get => m_name; set => m_name = value; }
        public string Text { get => m_value; set => m_value = value; }
    }

    public class ViewModelCustom
    {
        private String m_name = "";
        private String m_value = "";

        public string Name { get => m_name; set => m_name = value; }
        public string Text { get => m_value; set => m_value = value; }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

如果重要,请使用 .NET 4.5.2。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    或者 - 我可以在组合框关闭时隐藏“编辑...”按钮吗?

    这将是最简单的解决方案。在Style 中添加DataTrigger

    <Button x:Name="EditButton" Content="Edit..." Padding="4,0" Grid.Column="1">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard Storyboard="{StaticResource FlashOnOff}">
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    

    【讨论】:

    • 太好了,这绝对有效!不过让我对 XAML 翻白眼。所以当弹出窗口关闭时,comboboxitem Visibility == Collapsed。那么控件上显示的是什么?
    • @CongenitalOptimist:当元素树中没有父 ComboBoxItem 时,Button 被折叠。没有显示替代品。
    • 啊,我完全误读了这个。所以,当没有找到 ComboBoxItem 类型的祖先时,隐藏按钮。好的,现在明白了……咳咳。
    • 这很好,除了日志中的绑定失败消息:System.Windows.Data 警告:4:找不到绑定源,参考'RelativeSource FindAncestor,AncestorType='System.Windows.Controls。 ComboBoxItem ...我猜想解决方法是为 Button 附加属性来检查祖先类型?反正就是强迫症。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多