Команды привязки к событиям ToggleButton Checked and Unchecked

У меня есть ToggleButton в моем приложении WPF для С#, где я хотел бы привязать одну команду к проверенному событию и одну команду к событию Unchecked.

В настоящее время у меня есть следующее:

<ToggleButton Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port"
              Checked="btnOpenPort_Checked" Unchecked="btnOpenPort_Unchecked"
              IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}"
              Canvas.Left="75" Canvas.Top="80" Height="25" Width="100"/>

Но я не хочу этого делать. Поскольку в этом случае мне нужно было бы установить свойства в коде для события Checked and Unchecked. Вместо этого я хотел бы вызвать команду (ICommand) в моей ViewModel после того, как событие Checked or Unchecked будет запущено, так что мне не нужен какой-либо код для моей кнопки переключения.

Есть ли способ связать команду непосредственно для этих двух событий в XAML? Как и свойство команды "стандартного" управления кнопками в WPF?

ИЗМЕНИТЬ Вот как это работает в отношении подсказки @har07:

1: Добавлены ссылки, если вы еще этого не сделали:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"

2: Реализованное взаимодействие. Тестирование для отмеченных и непроверенных событий:

<ToggleButton 
        Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port"
        IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}"
        Canvas.Left="75" Canvas.Top="80" Height="25" Width="100">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Checked">
                <i:InvokeCommandAction Command="{Binding Path=PortViewModel.OpenPort}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="Unchecked">
                <i:InvokeCommandAction Command="{Binding Path=PortViewModel.ClosePort}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
</ToggleButton>

С помощью этого решения мне не нужно менять одну строку кода в моей модели ViewModel или моем коде. Я могу просто позвонить своей ICommand, как я бы сделал это со стандартной кнопкой после шаблона MVVM.

Ответ 1

Вы можете поместить логику для обработки отмеченного/непроверенного события в установщике свойства PortIsOpen:

private bool _portIsOpen;
public bool PortIsOpen
{
    get { return _portIsOpen; }
    set
    {
        if(value) HandleCheckedEvent();
        else HandleUnCheckedEvent();
        ....
    }
}

Или вы можете использовать расширение Ineraction.Triggers для привязки события к commmand: WPF привязка событий пользовательского интерфейса к командам в ViewModel

Ответ 2

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

<ToggleButton Command="{Binding MyCommand}"/>

в vm

public ICommand MyCommand { get; private set; }

вам нужно будет его инициализировать соответствующим образом

и для определения текущего состояния у вас может быть условие на связанное свойство PortIsOpen

void Execute(object state)
{
    if(PortIsOpen)
    {
        //checked
    }
    else
    {
        //unchecked
    }
}

или, возможно, вы также можете передать его как параметр

например,

<ToggleButton Command="{Binding MyCommand}" 
              CommandParameter="{Binding IsChecked,RelativeSource={RelativeSource Self}}"/>

и использовать его как

void Execute(object state)
{
    if((bool)state)
    {
        //checked
    }
    else
    {
        //unchecked
    }
}

Ответ 3

Возможно, мы можем использовать EventTriggers

    <ToggleButton>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Checked">
                <i:InvokeCommandAction Command="{Binding Path=CheckedCommand}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="Unchecked">
                <i:InvokeCommandAction Command="{Binding Path=UncheckedCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ToggleButton>

для использования триггеров мы должны ссылаться на System.Windows.Interactivity

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Ответ 4

 <ToggleButton Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port"
              Checked="{Binding ICommand}"  Unchecked="{Binding ICommand}"
              IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}"
              Canvas.Left="75" Canvas.Top="80" Height="25" Width="100"/>

Замените ICommand своим именем свойства ICommand.