在wpf中以编程方式添加主机控件时,命令绑定不起作用

时间:2010-10-29 08:23:36

标签: wpf xaml user-controls command commandbinding

这很奇怪。我有一个 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(未版本化)*

alt text

1 个答案:

答案 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的用户控件,并且项目中文件的名称与其内容不对应,并且没有太多有用的注释。 (总的来说,不是说“这不起作用”,而是描述你期望的行为;这使得那些试图帮助你解决实际问题的人更加清楚。)

我希望无论如何这都有用。