C#WPFアプリケーションにToggleButtonがあり、1つのコマンドをCheckedイベントにバインドし、1つのコマンドを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でコマンド(ICommand)を呼び出して、トグルボタンのコードビハインドが不要になるようにします。
XAMLでこれら2つのイベントのコマンドを直接バインドする方法はありますか? WPFの「標準」ボタンコントロールのコマンドプロパティに似ていますか?
[〜#〜] edit [〜#〜] @ 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または背後のコードの1行のコードを変更する必要がありません。 MVVMパターンに従って標準ボタンを使用する場合と同じように、ICommandを呼び出すだけです。
PortIsOpen
プロパティのセッターにチェック済み/未チェックのイベントを処理するロジックを配置できます。
private bool _portIsOpen;
public bool PortIsOpen
{
get { return _portIsOpen; }
set
{
if(value) HandleCheckedEvent();
else HandleUnCheckedEvent();
....
}
}
または、Ineraction.Triggers
イベントをコマンドにバインドするための拡張機能: WPF Binding UI events to commands in 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
}
}
たぶん、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"