将命令绑定到ToggleButton Checked和Unchecked事件

时间:2014-09-11 03:54:13

标签: wpf xaml command togglebutton

我的C#WPF应用程序中有一个ToggleButton,我想将一个Command绑定到Checked事件,将一个Command绑定到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和Unchecked事件的代码后面设置属性。 相反,一旦Checked或Unchecked事件被触发,我想在我的ViewModel中调用一个Command(ICommand),这样我的切换按钮就不需要任何代码了。

有没有办法直接为XAML中的这两个事件绑定命令? 类似于&#34;标准&#34;的命令属性。 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:为Checked和Unchecked事件实现了Interaction.Triggers:

<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模式使用标准按钮来调用它。

4 个答案:

答案 0 :(得分:19)

您可能无法为每个已检查和未检查的命令直接绑定两个命令,但您仍然可以绑定一个命令,该命令将为两个命令调用。如果您对两个事件都需要不同的命令,也可以选择附加行为。

<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
    }
}

答案 1 :(得分:7)

也许我们可以使用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"

答案 2 :(得分:6)

您可以将逻辑放在PortIsOpen属性的设置器中处理已检查/未检查的事件:

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

或者您可以使用Ineraction.Triggers扩展名将事件绑定到commmand: WPF Binding UI events to commands in ViewModel

答案 3 :(得分:-1)

 <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属性名称。