我有以下简单的代码:
<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')
你能解释一下它有什么问题吗?
答案 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)