3

これは変です。内部にボタンのあるUserControl(MyControl)があります。このボタンにコマンドを追加しました。そのコマンドターゲットは、同じウィンドウに再度追加される別のユーザーコントロールです。

xamlでUserControlを静的にCustomControlのホストスペースに追加すると、CommandBindingシステムは正常に機能しますが、UserControlがプログラムで追加された場合(このウィンドウのLoadedイベントで)は機能しません。

その理由は何でしょうか。ここに何かが足りないのですか?!?

アップデート:

*画像としての私の言葉のより良い表現。また、バイナリを使用してソースコードをアップロードしました@ https://code.google.com/p/commandbindingsample/および

http://cid-6fc1e241d4534589.office.live.com/embedicon.aspx/Wpf%20Samples/CommandBinding.zip(バージョン管理されていません)*

代替テキスト

4

1 に答える 1

1

ユーザーコントロールでは、次のCommandBindingように設定しています。

CommandTarget="{Binding ElementName=userControl11}"

プログラムの実行中に[出力]ウィンドウを見ると、次のことがわかります。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=userControl11'. BindingExpression:(no path); DataItem=null; target element is 'Button' (Name=''); target property is 'CommandTarget' (type 'IInputElement')

これはuserControl11、現在のネームスコープに名前が付けられた要素がないためです。XAMLネームスコープの動作の詳細については、これを参照してください。ただし、XAML名は、宣言されているページ、ウィンドウ、またはユーザーコントロール内でのみ表示されます。ウィンドウ内で宣言されている名前を内部から参照することはできません。ユーザーコントロール。

バインディングを介してユーザーコントロールにコマンドターゲットを設定できるようにする場合は、依存関係プロパティとして公開する必要があります。次のような宣言をコントロールに追加します。

public IInputElement CommandTarget
{
    get { return (IInputElement)GetValue(CommandTargetProperty); }
    set { SetValue(CommandTargetProperty, value); }
}

public static readonly DependencyProperty CommandTargetProperty =
        DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(UserControl1), new UIPropertyMetadata(null));

そして、ユーザーコントロールのXAMLで、このプロパティにバインドします。

<Button Content="Click" 
        Command="local:Commands.ClickCommand" 
        CommandTarget="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=CommandTarget}" />

これを実際にあなたのプロジェクトで機能させることはできませんが、それはあなたのプロジェクトを理解できないためです。異なる名前空間で名前が付けられた2つまたは3つのユーザーコントロールがあるようUserControl1ですが、プロジェクト内のファイルの名前はそれらのコンテンツに対応しておらず、有用な解説の方法はあまりありません。(一般的に、「これは機能しません」と言う代わりに、期待する動作を説明してください。これにより、実際の問題が何であるかを助けようとしている人にとって、より明確になります。)

とにかくこれがお役に立てば幸いです。

于 2010-11-02T18:07:34.450 に答える