0

Caliburn.Microの規則ベースのバインディングを使用していますが、小さな問題があります。

バインディングがバインドするプロパティを設定するにはどうすればよいですか?を使用してコントロールを作成する場合、の値をコントロールのプロパティ、コントロールのイベント、またはまたはプロパティなどの別の何かにバインドするx:Name="SomeProperty"かどうかを選択するにはどうすればよいですか?SomePropertyValueOnClickContentTag

例:HyperlinkButton特定のURLにバインドしたいこれがOnClickあり、ViewModelのイベントハンドラーにバインドしたい。

<HyperlinkButton x:Name="BookDetailsViewModel_InfoLink" Content="Read more" />

ただし、Contentプロパティは、URLの値ではなくRead more、URLの値で埋められます。この例では、どのようにすればよいですか?

  • ナビゲーションURIをViewModelプロパティのURLの値に設定します
  • コンテンツを「続きを読む」に設定します
  • クリックを処理するイベントハンドラーをViewModelで指定します

誰か助けてくれませんか?

4

1 に答える 1

1

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メソッドに渡します。

于 2012-11-26T21:28:32.780 に答える