ユーザーコントロールでは、次の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
ですが、プロジェクト内のファイルの名前はそれらのコンテンツに対応しておらず、有用な解説の方法はあまりありません。(一般的に、「これは機能しません」と言う代わりに、期待する動作を説明してください。これにより、実際の問題が何であるかを助けようとしている人にとって、より明確になります。)
とにかくこれがお役に立てば幸いです。