Команды привязки к событиям 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.