在嵌套的UserControls中与ElementName绑定

时间:2010-12-27 16:08:39

标签: c# wpf binding

我有以下简单的代码:

<Window x:Class="WpfApplication3.MainWindow"
        x:Name="WindowInst" …>
        <local:UserControl1/>
</Window>
<UserControl x:Class="WpfApplication3.UserControl1" …>
    <Button Content="Click me"
        Command="{Binding DataContext.ButtonClickedCommand,
                        ElementName=WindowInst}" Height="134" Width="314" />
</UserControl>

在Window的ViewModel中我有ButtonClickedCommand:

#region Avatar click command
RelayCommand _buttonClickedCommand;
public ICommand ButtonClickedCommand
{
    get
    {
        if (_buttonClickedCommand == null)
        {
            _buttonClickedCommand = new RelayCommand(() => this.ButtonClicked());
        }
        return _buttonClickedCommand;
    }
}

public void ButtonClicked()
{
}
#endregion

不幸的是,它会在运行时导致异常:

System.Windows.Data错误:4:找不到引用'ElementName = WindowInst'的绑定源。 BindingExpression:路径= DataContext.ButtonClickedCommand;的DataItem = NULL; target元素是'Button'(Name =''); target属性是'Command'(类型'ICommand')

你能解释一下它有什么问题吗?

2 个答案:

答案 0 :(得分:2)

尝试修改您的绑定,如下所示......

<Window x:Class="WpfApplication3.MainWindow"
        x:Name="WindowInst" …>
        <local:UserControl1/>
</Window>
<UserControl x:Class="WpfApplication3.UserControl1" …>
    <Button Content="Click me"
        Command="{Binding Path=ButtonClickedCommand, Mode=FindAncestor, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Height="134" Width="314" />
</UserControl>

这应该有效,因为WindowInst不在Self内,因为您的容器是UserControl;它位于Window内。此外,您需要确保将DataContext设置在Window内,否则其值将为null,无论您的语法是否准确,都不会发生任何绑定。

答案 1 :(得分:1)

你的绑定有点不对。

请参阅有关WPF命令绑定的this tutorial

作为一般规则,请在绑定中尽可能少地指定。在这种情况下,我认为你不需要元素名称,而datacontext是绑定的假定根。