这很奇怪。我有一个 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(未版本化)*
答案 0 :(得分: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名称范围如何工作的完整详细信息,请参阅this,但简而言之,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}" />
我实际上无法在你的项目中使用它,但那是因为我无法计算你的项目。您似乎在不同的命名空间中有两个或三个名为UserControl1
的用户控件,并且项目中文件的名称与其内容不对应,并且没有太多有用的注释。 (总的来说,不是说“这不起作用”,而是描述你期望的行为;这使得那些试图帮助你解决实际问题的人更加清楚。)
我希望无论如何这都有用。