当在WPF中以编程方式添加宿主控件时,命令绑定无法工作。

3
这很奇怪。我有一个名为MyControl的,里面包含一个按钮。我已经添加了一个命令到这个按钮,并将其命令目标设置为另一个用户控件,该用户控件也被添加到同一个窗口中。
当我在XAML中静态地将添加到CustomControl的宿主空间中时,命令绑定系统可以正常工作,但如果在此窗口的Loaded事件中以编程方式添加,则无法正常工作。
可能是什么原因呢?我错过了什么吗?
更新: 更好地表示我的话语的图像。同时,我已上传带有二进制文件的源代码https://code.google.com/p/commandbindingsample/http://cid-6fc1e241d4534589.office.live.com/embedicon.aspx/Wpf%20Samples/CommandBinding.zip(未加版本号)。

alt text

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的元素。请参阅this,了解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}" />

我实际上无法在你的项目中使它正常工作,但这是因为我无法理解你的项目。你似乎在不同的命名空间中有两个或三个名为的用户控件,并且项目中的文件名与其内容不对应,而且没有太多有用的注释。(总的来说,不要只说"这不起作用",描述一下你期望的行为会让帮助你的人更清楚你可能遇到的实际问题。)

尽管如此,我希望这些信息对你有所帮助。


感谢您的努力。
我已经在 MSDN 论坛上问了同样的问题,幸运的是有一些人能够更好地理解这个问题。如果您想跟进解决方案,可以在这里查看:http://social.msdn.microsoft.com/Forums/en/wpf/thread/ea850968-6f24-4209-9d73-0659125271c4
- sudarsanyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接