一緒にテストを投げただけで、これらは両方とも私にとってはうまくいきます:
完全な構文を使用する:
<TextBox Name="Threshold"
Margin="5"
Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="ExecuteFilterView">
<cal:Parameter Value="$executionContext"/>
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
CM 構文を使用する (読みやすいため、これをお勧めします)
<TextBox Name="Threshold"
Margin="5"
Grid.Column="1"
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]" />
これはテスト VM でした。
public class MainWindowViewModel
{
public void ExecuteFilterView(ActionExecutionContext context)
{
// This method is hit and the context is present and correct
}
}
完全なコードを投稿できますか - フレームワークが正しくセットアップされていると確信していますか? (開始例に従っていますか?
http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=ドキュメント
編集:
あなたの明確化の後、私はあなたにこれを行う方法のいくつかの例を与えることができます.私の個人的な好みとその理由をお話しします.
ActionExecutionContext
eventargs の使用とキャスト:
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]"
public void ExecuteFilterView(ActionExecutionContext context)
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null && keyArgs.Key == Key.Enter)
{
// Do Stuff
}
}
EventArgs
直接使用する
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($eventArgs)]"
public void ExecuteFilterView(KeyEventArgs keyArgs)
{
if (keyArgs.Key == Key.Enter)
{
// Do Stuff
}
}
- 私の個人的なお気に入りは、独自の
SpecialValues
辞書エントリを作成することです。
あなたのBootstrapper.Configure
方法では...
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
// NOTE: IMPORTANT - you MUST add the dictionary key as lowercase as CM
// does a ToLower on the param string you add in the action message, in fact ideally
// all your param messages should be lowercase just in case. I don't really like this
// behaviour but that's how it is!
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null)
return keyArgs.Key;
return null;
});
あなたの行動:
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($pressedKey)]"
そしてコード:
public void ExecuteFilterView(Key key)
{
if (key == Key.Enter)
{
// Do Stuff
}
}
これが私のお気に入りの理由は?これは、VM が必要な値を受け取るだけであることを意味し (ほとんどの場合、他の多くのパラメーターは気にしません)、eventargs をキャストする方法を知る必要も、わざわざキャストする必要もありません。操作するだけで済みます。値について。明らかにあなたに最適なものを使用してください
また、サブクラス化する他のタイプのコントロールがある場合、KeyEventArgs
これが機能することにも注意してください。それらがサブクラス化されていないKeyEventArgs
が、型の値を返すKey
場合でも、最初のキャストが失敗した場合に別のキャストをデリゲートに追加できるため、これも機能します。
例えば
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null)
return keyArgs.Key;
// Ok so it wasn't KeyEventArgs... check for some other type - maybe a 3rd party implementation
var thirdPartyKeyArgs = context.EventArgs as ThirdPartyKeyArgs;
if (thirdPartyKeyArgs != null)
return thirdPartyKeyArgs.KeyProperty;
return null;
});