Mvvm WPF:设置绑定在XAML中不起作用的UserControl的DataContext

Mvvm WPF:设置绑定在XAML中不起作用的UserControl的DataContext,mvvm,binding,Mvvm,Binding,我正试图让我的第一个WPF应用程序使用MVVM工作,我遇到了一个绑定小问题 设置是,我有一个视图和视图模型,其中保存用户详细信息(父视图),为了尽量保持简单,我将该视图的一部分放在一个单独的视图和视图模型(子视图)中。子视图定义为UserControl 我遇到的问题是如何设置子视图(UserControl)的DataContext。我的父视图模型有一个属性,该属性公开子视图模型,如下所示: class ParentViewModel: INotifyPropertyChanged { p

我正试图让我的第一个WPF应用程序使用MVVM工作,我遇到了一个绑定小问题

设置是,我有一个视图和视图模型,其中保存用户详细信息(父视图),为了尽量保持简单,我将该视图的一部分放在一个单独的视图和视图模型(子视图)中。子视图定义为UserControl

我遇到的问题是如何设置子视图(UserControl)的DataContext。我的父视图模型有一个属性,该属性公开子视图模型,如下所示:

class ParentViewModel: INotifyPropertyChanged
{
    public ChildViewModel childViewModel { get; set; }
    //...
}
在父视图的XAML(其DataContext设置为ParentViewModel)中,我尝试如下设置子视图的DataContext:

<views:ChildView 
    x:Name="ChildView"
    DataContext="{Binding childViewModel}"/>
这段代码也让我感到不安,因为LOD违规等等

似乎问题出在DataContext上——我可以在子对象中绑定其他内容,例如,我尝试将FontSize绑定到int属性以测试它:

<views:ChildView 
    x:Name="ChildView"
    FontSize="{Binding Path=someVal}"/>

这很好

但我确信绑定DataContext应该会起作用——我见过类似的例子。我错过了什么明显的东西吗?这有什么不起作用的原因吗?某处有拼写错误吗?(为了你的利益,我重新命名了东西,所以你无论如何也不能帮我)

欢迎有任何想法

编辑

再次回顾这段代码,似乎我在某个地方犯了一个错误,因为父视图中的以下XAML现在看起来确实起作用了:

<views:ChildView 
    x:Name="ChildView"
    DataContext="{Binding childViewModel}"/>


我不知道为什么我最初不能让它工作,或者我可能已经改变了什么使它工作。也许这是inotifyproperty改变的问题,正如其中一个答案所暗示的那样。哦,好吧,向前和向上..

我怀疑这是因为childViewModel属性没有引发PropertyChanged事件。当对绑定求值时,该属性可能为null(在这种情况下,DataContext将返回到父级的属性)。稍后实例化childViewModel时,不会引发PropertyChanged事件,并且绑定永远不会被告知现在有DataContext

尝试在childViewModel属性中引发PropertyChanged事件

干杯,
劳伦特

我也在寻找同样的东西,我找到了一种方法。基本上,我使用

我在某些父控件(窗口)上设置了
x:Name=“\u topLevel”

我尝试使用
RelativeSource/FindAncestor
代替ElementName,但没有成功,但这可能是我的错


对我来说,这就像是一个黑客,但总比绑定到顶级视图模型要好。

这不是问题的答案,但可能会在同样的情况下帮助其他人

我正好碰到了这个问题,发现

parentView.ChildView.DataContext = parentViewModel.childViewModel;
这种方法是有效的(尽管我发现它在做Show()之前是有效的),但和最初的提问者一样对此感到不安,所以我尝试了这个方法

DataContext="{Binding ElementName=_topLevel, Path=DataContext.childViewModel}"
这种方法似乎也起了作用。但后来我又试着回到原始代码和原始XAML,现在它突然也起作用了。这反映了原始提问者的行为,作者认为他们在某个地方犯了错误,因为XAML似乎没有明显的原因开始工作

我能看到的唯一变化是VisualStudio现在在设计时在UserControl中显示示例数据,因此它在某个地方缓存了一些示例数据,这似乎使它能够工作。不幸的是,我不确定这两个变化中的哪一个导致了这种情况


示例数据的出现让我怀疑这个问题是否与d:DataContext的使用有关,我在父级和子级XAML文件中使用了d:DataContext,但这只是猜测。

思考得不错,但恐怕没有乐趣。我想这可能与顺序有关,但是当绑定发生时,子viewModel应该是可用的-当我使用int属性设置字体大小时,它会起作用,而int属性是同时发生的,而不是使用PropertyChanged。虽然我没有尝试过,但应该可以起作用,因此,经过这么长时间之后,我会给你+1的努力-但这个解决方案与我上面建议的解决方案有相同的问题,那就是孩子知道父母的情况。这可能只是一种异味,也可能是一个真正的问题,这取决于您是否在不同的父视图中使用子视图。当检查我的代码以获得这个答案时,我发现它现在可以工作了,尽管我不知道为什么-请参阅编辑以了解详细信息。
<views:ChildView 
    x:Name="ChildView"
    DataContext="{Binding childViewModel}"/>
DataContext="{Binding ElementName=_topLevel, Path=DataContext.childViewModel}"
parentView.ChildView.DataContext = parentViewModel.childViewModel;
DataContext="{Binding ElementName=_topLevel, Path=DataContext.childViewModel}"