前の記事 に少し手を加えました。
作成したソースは GitHub で公開しています。
今回は、TriggerAction
に加えて IValueConverter
, ICommand
も実装してみました。
Converter と Command はマークアップ拡張にできるので、ワンライナーで書くのがいいと思います。
使用例
ScriptCommand
バインドした ComandParameter
を Prm
としてスクリプト内で扱えます。
この例ではクリック時にウィンドウを最大化させます。
<Window Name="wnd">
<Button Command="{script:ScriptCommand 'Prm.WindowState = WindowState.Maximized'}"
CommandParameter="{Binding ElementName=wnd}" />
</Window>
ScriptConverter
変換前の値を Value
としてスクリプト内で扱えます。
この例ではウィンドウが最大化しているときにボタンを無効にします。
<Window Name="wnd">
<Button IsEnabled="{Binding ElementName=wnd,
Path=WindowState,
Converter={script:ScriptConverter 'Value != WindowState.Maximized'}}" />
</Window>
ScriptAction
バインドした Arg1
~ Arg4
をスクリプト内で使えるようになってます。
ちなみに Arg0
は TriggerAction<>.AssociatedObject
です。
この例では入力状況によってメッセージボックスの内容を変化、
さらにボタンの文字列をクリック回数によって変更しています。
<TextBox Name="tbFirstName" />
<TextBox Name="tbFamilyName" />
<Button Content="Click">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<script:ScriptAction Arg1="{Binding ElementName=tbFirstName}"
Arg2="{Binding ElementName=tbFamilyName}">
static int i = 0;
Arg0.Content = string.Format("Clicked ({0})", ++i);
if (string.IsNullOrWhiteSpace(Arg1.Text))
{
MessageBox.Show("Please enter your first name.");
Arg1.Focus();
}
else if (string.IsNullOrWhiteSpace(Arg2.Text))
{
MessageBox.Show("Please enter your family name.");
Arg2.Focus();
}
else
{
MessageBox.Show(string.Format("Hello {0} {1}!!", Arg1.Text, Arg2.Text));
}
</script:ScriptAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>