Wpf 更改内容会在使用DataTemplate时更改DataContext X问题。

Wpf 更改内容会在使用DataTemplate时更改DataContext X问题。,wpf,mvvm,datacontext,Wpf,Mvvm,Datacontext,我想暂时放大(让它占据整个可用空间)窗口内容的一部分 窗口布局相当复杂:许多嵌套面板、拆分器,要放大的内容有10层深。更改可见性来拉伸内容是远远不够的(多亏了拆分器),而且看起来非常复杂 Y问题 我决定将该内容移动到用户控件中,并执行类似(伪代码)的操作 没问题。它在测试项目中工作得非常好。。。直到我开始使用数据模板 问题:如果使用数据模板,则只要出现window.Content=newContent,该newContent.DataContext就会丢失,并与window.DataContex

我想暂时放大(让它占据整个可用空间)窗口内容的一部分

窗口布局相当复杂:许多嵌套面板、拆分器,要放大的内容有10层深。更改
可见性
来拉伸内容是远远不够的(多亏了拆分器),而且看起来非常复杂

Y问题 我决定将该内容移动到用户控件中,并执行类似(伪代码)的操作

没问题。它在测试项目中工作得非常好。。。直到我开始使用数据模板

问题:如果使用数据模板,则只要出现
window.Content=newContent
,该
newContent.DataContext
就会丢失,并与
window.DataContext
相同。这将触发各种绑定错误、附加行为突然更改为默认值等。。各种各样的坏事

问题:
DataContext
为什么在变化?如何预防/解决此问题?
这是一份复印件(对不起,不能再短了):

MainWindow.xaml包含

<Window.Resources>
    <DataTemplate DataType="{x:Type local:ViewModel}">
        <local:UserControl1 />
    </DataTemplate>
</Window.Resources>
<Grid Background="Gray">
    <ContentControl Content="{Binding ViewModel}" />
</Grid>
<Button Width="100"
        Height="100"
        CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
        Command="{Binding Command}" />
UserControl1.xaml包含

<Window.Resources>
    <DataTemplate DataType="{x:Type local:ViewModel}">
        <local:UserControl1 />
    </DataTemplate>
</Window.Resources>
<Grid Background="Gray">
    <ContentControl Content="{Binding ViewModel}" />
</Grid>
<Button Width="100"
        Height="100"
        CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
        Command="{Binding Command}" />

var a=…
上设置断点,启动程序,单击按钮,执行步骤并观察
按钮。DataContext
以及
输出
窗口中的绑定错误。

您必须尝试将
数据模板
用作
内容控件的
内容模板
。由于
ContentTemplate
Content
进行操作,因此它将使用
Content
作为其
DataContext
。您的
内容
包含
ViewModel

一旦您的按钮不再是
数据模板的一部分,它将使用
main窗口的
DataContext

没有看到您的评论,我假设您希望
UserControl
DataContext
保持完整,即使您的
UserControl
不是
DataTemplate
的一部分

因此,使用
XAML
使用
RelativeSource
显式设置
DataContext
按钮

例如

<Button Content="{Binding Data}" DataContext="{Binding vm1, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" /> 


在代码中使用
DataContext
不是一个好主意。

好的,这里有一些一般的想法

如果将对象(viewmodel)绑定到contentcontrol的Content属性,则wpf将使用DataTemplate来可视化该对象。如果您没有DataTemplate,您只会看到object.ToString()。DataContext继承意味着DataContext被继承到子元素。因此,real用户控件将从父控件继承DataContext。创建UserControl时,您在stackoverflow上会发现一些常见错误,它们经常会破坏DataContext继承,并将DataContext设置为self或新的DataContext


还添加UserControl1代码,其中u正在设置其DC,以及使用DataTemplate的原因和位置?@AnjumSKhan,由于数据模板化,无需设置
UserControl1.DataContext
。单击按钮之前,一切都正常。这是一个演示案例的复制,而不是真正的项目(必须使用datatemplates)。DataTemplate在MainWindow中使用,所以它自然会从MainWindow获得DC。如果您在UC代码中设置UC的DC,则它将不同。在您的UC中,不会有任何DC,因为您没有设置它。一旦它成为主窗口的一部分,它将获得它的DC。@AnjumSKhan,然后告诉我为什么
a==ViewModel
?在提问之前,请先尝试一下代码好吗?带有viewmodel控件的mvvm复制它不是mvvm复制对不起。
button.DataContext=button.DataContext
修复了它。谢谢你的解释。