我正在尝试将命令传递给WPF用户控件中的元素。
<UserControl x:Class="MyApp.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- shortened -->
<Button Command="{Binding Command}">
<Button.Content>
<!-- shortened -->
</Button.Content>
</Button>
</UserControl>
public partial class MyControl : UserControl
{
public static readonly DependencyProperty CommandProperty
= DependencyProperty.Register("Command",
typeof(ICommand), typeof(MyControl));
//shortened
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
//shortened
}
<uc:MyControl Command="{Binding DoStuffCommand}" /> <!-- shortened -->
单击用户控件中的按钮时,没有任何反应。
当我调试时,Command
属性为null。
将命令绑定到用户控件之外的按钮上这是怎么回事?
答案 0 :(得分:8)
DataContext
的默认Button
是您的UserControl的DataContext
,而不是您的UserControl,因此您尝试绑定到DataContext.Command
而不是UserControl.Command
< / p>
要绑定到UserControl.Command
,请使用RelativeSource
绑定
<Button Command="{Binding Command, RelativeSource={
RelativeSource AncestorType={x:Type local:MyControl}}}">
编辑刚刚注意到HB's answer,这也有效。通常我更喜欢RelativeSource
绑定到ElementName
个,因为有时我会重命名项目并且常常忘记其他控件通过名称引用该项目
答案 1 :(得分:5)
为控件命名并使用ElementName
:
<UserControl ...
Name="control">
<Button Command="{Binding Command, ElementName=control}">
<!-- ... -->
答案 2 :(得分:0)
一般来说,我总是遵循Rachel的建议(如上面的one)。但在这种特殊情况下,我会考虑在用户控件的根元素上设置DataContext
,然后在那里进行整齐的绑定。
<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}">
<!-- shortened -->
<Button Command="{Binding Command}">
<Button.Content>
<!-- shortened -->
</Button.Content>
</Button>
</Grid >
答案 3 :(得分:-1)
好吧,我只想从主机控件/窗口绑定命令。因为数据上下文将从它继承。这样的事情。
<UserControl x:Class="MyApp.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- shortened -->
<Button Command="{Binding DoStuffCommand}">
<Button.Content>
<!-- shortened -->
</Button.Content>
</Button>
</UserControl>
然后,您可以从代码隐藏文件中删除依赖项属性代码。
删除命令属性绑定
<uc:MyControl />