Шаблон данных WPF со списком не активируется при сворачивании списка - PullRequest
0 голосов
/ 23 марта 2020

Как сделать так, чтобы кнопка в элементе ComboBox нажимала, когда выпадающий список закрыт?

У меня есть пользовательский элемент управления WPF для некоторых вариантов выбора c и элемент "custom ..." в конце списка, где DataTemplate для пользовательского элемента имеет кнопку "Edit ...".

Кнопка работает в выпадающих элементах, но не в выбранном значении. Нажмите на закрытое поле со списком, вместо этого откроется выпадающий список. Альтернативно - можно ли просто скрыть кнопку «Редактировать ...», когда выпадающий список закрыт?

Sample screenshot

Простое тестовое приложение 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, если это имеет значение.

1 Ответ

1 голос
/ 23 марта 2020

Альтернативно - можно ли просто скрыть кнопку «Редактировать ...», когда выпадающий список закрыт?

Это было бы самым простым решением. Добавьте DataTrigger к Style:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...