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