CMの要素タイプごとにConventionManagerをカスタマイズできます。デフォルトのすぐに使用可能な実装は、明示的なカスタマイズがないすべての要素に適用されます
新しいコンベンションを追加するには、ConventionManager.AddElementConventionを呼び出すだけです。
メソッドは次のようになります(CMソースから)
/// <summary>
/// Adds an element convention.
/// </summary>
/// <typeparam name="T">The type of element.</typeparam>
/// <param name="bindableProperty">The default property for binding conventions.</param>
/// <param name="parameterProperty">The default property for action parameters.</param>
/// <param name="eventName">The default event to trigger actions.</param>
public static ElementConvention AddElementConvention<T>(DependencyProperty bindableProperty, string parameterProperty, string eventName)
{
return AddElementConvention(new ElementConvention
{
ElementType = typeof(T),
GetBindableProperty = element => bindableProperty,
ParameterProperty = parameterProperty,
CreateTrigger = () => new EventTrigger { EventName = eventName }
});
}
ご覧のとおり、いくつかの引数が必要です。バインディング、アクション、トリガーのデフォルトのプロパティを渡す必要があります。
ConventionManager.AddElementConvention<HyperlinkButton>(HyperlinkButton.NavigateUri, "NavigateUri", "Click");
(クリックイベントがクリックと呼ばれると仮定します)
プロパティをバインドしなくContent
なったため(NavigateUriをバインドするのが慣例であるため)、そのままにしておくことができ、「続きを読む...」のままにする必要があります。
これHyperlinkButton
で、慣例によりにバインドするコントロールができ、イベントがトリガーNavigateUri
されたときにその名前を共有するメソッドを呼び出すことができます。Click
編集:
同じ名前を共有するメソッドとプロパティを持つことはできないため、同じVM上のメソッドとプロパティの両方にバインドできるとは思わないことを明確にするかもしれませんが、CMはバブルになると確信していますVMに適切なメソッドがない場合は、VM階層の上位にあるアクションメッセージ...ただし、試していない。アクションをバインドするには、以下の他の編集を参照してください
忘れないでください、あなたはいつでもこれらすべてに明示的な構文を使うことができます!
<HyperlinkButton Content="Read more..." NavigationURI="{Binding SomeUri}" cal:Message.Attach="[Event Click] = [Action HyperlinkClicked($this.NavigateUri)" />
しかし、おそらくコンベンションルートに行く方が良いでしょう:)
編集:
ハイパーリンクからプロパティ値を取得するための規則を取得する方法を追加する可能性があります-
<HyperlinkButton x:Name="SomeLink" Content="Read more..." cal:Message.Attach="HyperlinkClicked(SomeLink)" />
CMNavigateUri
は、デフォルトのアクションパラメーターとして設定したため、これを取得して、アクションバインディングで指定したメソッドに渡す必要があることを認識しています。私$this
もうまくいくかどうか疑問に思っています(おそらく必要になるでしょう$this.NavigateUri
)。これは、コントロール全体で実行できます。
<TextBox x:Name="SomeTextBox" />
<HyperlinkButton x:Name="SomeLink" Content="Read more..." cal:Message.Attach="HyperlinkClicked(SomeTextBox)" />
上記は、デフォルトText
でテキストボックスのプロパティをHyperlinkClicked
メソッドに渡します。