Установить обработчик нажатия кнопки с помощью DataTrigger - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь обновить некоторые визуальные свойства и обработчик щелчка на кнопке в ответ на значение перечисления.Визуальные свойства достаточно просты, но обработчик щелчков доставляет мне проблемы.

Перечисление имеет 4 значения: Запуск, Запуск, Завершение, Завершено.Кнопка запускает или убивает процесс в зависимости от текущего состояния.Вот что у меня есть для визуальных свойств:

<Button>
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Launching}">
                    <Setter Property="IsEnabled" Value="false"/>
                    <Setter Property="Content" Value="Launching..."/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Launched}">
                    <Setter Property="IsEnabled" Value="true"/>
                    <Setter Property="Content" Value="Terminate"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Terminating}">
                    <Setter Property="IsEnabled" Value="false"/>
                    <Setter Property="Content" Value="Terminating..."/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Terminated}">
                    <Setter Property="IsEnabled" Value="true"/>
                    <Setter Property="Content" Value="Launch"/>

                    <!-- Doesn't work!
                    <EventSetter Event="Click" Handler="LaunchSim_Click"/>
                    -->
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Проблема в том, что Style.Triggers не поддерживает EventSetter, поэтому я не могу обновить Button.Click с помощью этого подхода.Теперь я мог бы использовать обработчик одного клика и ветвь на основе перечисления, но я хочу понять, что возможно со стороны XAML.

Я также пытался создать 4 отдельных стиля в Button.Resources, затем меняем стили с помощью DataTrigger, но в итоге вы пытаетесь изменить стиль кнопки, используя стиль, и я не уверен, что это тоже работает.

Есть ли разумный способ изменить Button.Click из XAML в ответ на изменение значения данных?

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Есть ли разумный способ изменить Button.Click с XAML в ответ на изменение значения данных?

Нет, нет. Использование обработчика одного клика и ветви на основе перечисления звучит как хорошая идея. В качестве альтернативы, если вы знакомы с шаблоном проектирования MVVM, вы можете привязаться к команде модели представления и обработать свою логику там. Действительно возможно установить свойство Command, используя Setter в Style, но помните, что XAML является языком разметки и только потому, что вы можете , можете сделать определенные вещи в чистом XAML, это не значит, что вы всегда должны.

1 голос
/ 27 мая 2019

Вместо EventSetter вы можете сделать

<Setter Property="Command" Value="{Binding SomeCommand}"/>

На самом деле, если вы хотите, чтобы кнопка активировалась только в одном состоянии enum, вы можете просто привязать к SomeCommand и создать команду, которая активна только тогда, когдавыбран конкретный тип перечисления.

например

<Button Command={Binding SomeCommand} >
   Style...
</Button>

В модели представления вы можете сделать

SomeCommand = new RelayCommand(SomeMethod, ()=> ProcessState == ProcessState.Terminated);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...