ck8*_*4vi 12 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"/>
Run Code Online (Sandbox Code Playgroud)
但这不是我的目标.因为在这种情况下,我必须在Checked和Unchecked事件的代码后面设置属性.相反,我想在Checked或Unchecked事件被触发后在我的ViewModel中调用一个Command(ICommand),这样我的切换按钮后面不需要任何代码.
有没有办法直接为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"
Run Code Online (Sandbox Code Playgroud)
2:已检查和未检查事件的已实现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>
Run Code Online (Sandbox Code Playgroud)
有了这个解决方案,我不必在我的ViewModel或后面的代码中更改一行代码.我可以调用我的ICommand,就像我在MVVM模式下使用标准按钮一样.
pus*_*raj 21
您可能无法为每个已检查和未检查的命令直接绑定两个命令,但您仍然可以绑定一个命令,该命令将为两个命令调用.如果您需要对两个事件使用不同的命令,也可以选择附加行为.
<ToggleButton Command="{Binding MyCommand}"/>
Run Code Online (Sandbox Code Playgroud)
在vm
public ICommand MyCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)
你需要相应地初始化它
并确定当前状态,您可能对保税财产有条件 PortIsOpen
void Execute(object state)
{
if(PortIsOpen)
{
//checked
}
else
{
//unchecked
}
}
Run Code Online (Sandbox Code Playgroud)
或者也许您可以将其作为参数传递
例如
<ToggleButton Command="{Binding MyCommand}"
CommandParameter="{Binding IsChecked,RelativeSource={RelativeSource Self}}"/>
Run Code Online (Sandbox Code Playgroud)
并用它作为
void Execute(object state)
{
if((bool)state)
{
//checked
}
else
{
//unchecked
}
}
Run Code Online (Sandbox Code Playgroud)
也许我们可以使用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>
Run Code Online (Sandbox Code Playgroud)
使用我们必须引用的触发器 System.Windows.Interactivity
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Run Code Online (Sandbox Code Playgroud)
您可以将逻辑放在PortIsOpen属性setter中处理已检查/未检查的事件:
private bool _portIsOpen;
public bool PortIsOpen
{
get { return _portIsOpen; }
set
{
if(value) HandleCheckedEvent();
else HandleUnCheckedEvent();
....
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用Ineraction.Triggers扩展将事件绑定到commmand:
WPF绑定UI事件到ViewModel中的命令
| 归档时间: |
|
| 查看次数: |
23952 次 |
| 最近记录: |