C# UserControl命令数据绑定问题-分离数据上下文?

C# UserControl命令数据绑定问题-分离数据上下文?,c#,wpf,data-binding,.net-4.0,command,C#,Wpf,Data Binding,.net 4.0,Command,在一次关于数据绑定和用户控件的讨论中,我在设置简单的属性以便更改颜色、大小等方面遇到了问题。Kent给了我一些很好的指针,效果很好。然后,我编写了一个新的UserControl,并使用他的建议,使它也工作得很好 现在我进入下一步--数据绑定命令。我当前的结构如下所示: <UserControl x:Name="root"> <Grid DataContext="{Binding ElementName=root}"> ... <Button Comm

在一次关于数据绑定和用户控件的讨论中,我在设置简单的属性以便更改颜色、大小等方面遇到了问题。Kent给了我一些很好的指针,效果很好。然后,我编写了一个新的UserControl,并使用他的建议,使它也工作得很好

现在我进入下一步--数据绑定命令。我当前的结构如下所示:

<UserControl x:Name="root">
  <Grid DataContext="{Binding ElementName=root}">
  ...
    <Button Command="{Binding MyCommand}" />
  ...
  </Grid>
</UserControl>
<Button Command="{Binding Path=DataContext.MyCommand, RelativeSource={RelativeSource     Mode=FindAncestor, AncestorType={x:Type TypeOfYourControlWithViewModelDataContext}}"/>
窗口--包含-->UserControlB--包含-->UserControlA

现在UserControlA中的数据绑定属性工作得很好,我的UserControlB公开了这些相同的属性,因此窗口可以间接更改UserControlA。问题是UserControlB的DataContext设置如下:

<UserControl x:Name="root">
  <Grid DataContext="{Binding ElementName=root}">
  ...
    <Button Command="{Binding MyCommand}" />
  ...
  </Grid>
</UserControl>
<Button Command="{Binding Path=DataContext.MyCommand, RelativeSource={RelativeSource     Mode=FindAncestor, AncestorType={x:Type TypeOfYourControlWithViewModelDataContext}}"/>

...
...
但我希望MyCommand绑定到我的ViewModel。我认为可以单独设置DataContext,但是如何让按钮指向XAML中的ViewModel呢


我找到了一份工作,但听起来不像我想做的。我想用代码而不是XAML创建ViewModel。

您的绑定应该如下所示:

<UserControl x:Name="root">
  <Grid DataContext="{Binding ElementName=root}">
  ...
    <Button Command="{Binding MyCommand}" />
  ...
  </Grid>
</UserControl>
<Button Command="{Binding Path=DataContext.MyCommand, RelativeSource={RelativeSource     Mode=FindAncestor, AncestorType={x:Type TypeOfYourControlWithViewModelDataContext}}"/>


谢谢,我试试看。我应该开始尝试一些东西,但当我试图弄清楚所有东西是如何连接的,以及什么是设置祖先的逻辑方法时,我总是完全迷茫。嗯。。。还没有运气。我收到此错误:
System.Windows.Data错误:4:找不到引用“RelativeSource FindAncestor,AncestorType='Company.MyPlugin',AncestorLevel='1'的绑定源。BindingExpression:Path=DataContext.MyCommand;DataItem=null;目标元素是“按钮”(名称=“”);目标属性为“Command”(键入“ICommand”)
。看起来您仍然没有datacontext权限。您需要将相对源类型设置为具有viewmodel的datacontext的任何类型。此外,如果您没有将网格的datacontext覆盖到控件,您似乎可以自动获得此结果,而只需允许datacontext从父控件自然向下流动即可。@poindexter:在网格中指定datacontext是否允许我的其他UserControl(在此UserControl内)正确地进行数据绑定?不过我会试试看。@poindexter:很有趣,所以只要完全删除DataContext就可以让一切正常工作。我对此感到非常困惑。我需要阅读更多关于数据绑定的“流”的内容,但是如果你能发布你最喜欢的文章,我很乐意阅读谢谢你的建议。