Как привязать две команды к кнопке WPF?

Я использую WPF с шаблоном MVVM. У меня есть кнопка и две команды. Кроме того, у меня есть флажок. И я хочу привязать к кнопке разные команды, в зависимости от флажка IsChecked или нет, например

Если я нажму кнопку, появится окно сообщения;

если я поставлю флажок и нажму кнопку, откроется новое окно или что-то еще ..

У меня есть решение для этого, но я думаю, что может быть решение получше:

Моя модель просмотра:

ICommand command1 { get; set; }
ICommand command2 { get; set; }
ICommand commandSelector
{
    get
    {
        if (checkbox)
        {
            return command1;
        }
        else
        {
            return command2;
        }
    }
    private set { }
}

Мой XAML:

<Button Label = "DO" Command = "{Binding commandSelector}"/>

Возможный дубликат Привязка команд к событиям ToggleButton Checked и Unchecked

Jordy van Eijk 24.05.2018 14:09

Я бы просто использовал 2 кнопки и один из многих способов, чтобы одновременно отображалась только 1 кнопка: привязка Visibility, шаблоны данных, селектор шаблонов, триггер данных стиля и т. д.

Sinatr 24.05.2018 15:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 847
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в триггере можно изменить привязку свойства Command:

<Button Label = "DO">    
    <Button.Style>        
        <Style TargetType = "Button">            
            <Setter Property = "Command" Value = "{Binding command2}"/>
            <Style.Triggers>
                <DataTrigger Binding = "{Binding IsChecked, ElementName=someCheckBox}" Value = "True">
                    <Setter Property = "Command" Value = "{Binding command1}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>        
    </Button.Style>    
</Button>

но, вероятно, лучше иметь одну команду и выполнять разные действия в зависимости от состояния проверки в обработчике команд:

ICommand commandSelector { get; set; }

private void commandSelectorExecute(object o)
{
    if (checkbox)
       DoSmth();
    else 
       DoSmthElse();
}

Я думаю, что это лучший способ сделать это .. Я бы не стал менять команды на checkstate, а наоборот.

Jordy van Eijk 24.05.2018 14:07

Другие вопросы по теме