C# 在高级数据模板中处理数据上下文更改
我正在WPF中编写一个MDI应用程序-文档显示在选项卡中 由于选项卡显示完整的文档,TabControl的DataTemplate显然相当复杂-包括CodeBehind中的一些初始化/去初始化代码(没有黑客攻击-这只是我使用的控件,即AvalonEdit所需要的)。但问题是,TabControl重用了创建的DataTemplate,当我更改活动文档时,只替换DataContext—忽略了在加载/卸载事件中执行的所有初始化/取消初始化过程 我想挂起C# 在高级数据模板中处理数据上下文更改,c#,wpf,datacontext,C#,Wpf,Datacontext,我正在WPF中编写一个MDI应用程序-文档显示在选项卡中 由于选项卡显示完整的文档,TabControl的DataTemplate显然相当复杂-包括CodeBehind中的一些初始化/去初始化代码(没有黑客攻击-这只是我使用的控件,即AvalonEdit所需要的)。但问题是,TabControl重用了创建的DataTemplate,当我更改活动文档时,只替换DataContext—忽略了在加载/卸载事件中执行的所有初始化/取消初始化过程 我想挂起DataContextChanged事件,但有一个
DataContextChanged
事件,但有一个陷阱:
当元素的DataContext更改时,此元素上的所有数据绑定属性都可能受到影响。这适用于逻辑树中当前元素的子元素(继承数据上下文)以及当前元素本身。所有这些现有绑定都必须重新解释新的DataContext,并将重新评估绑定结果。相对于DataContextChanged事件的引发,数据绑定引擎无法确定这些重新评估的顺序。重新评估可以在事件之前、事件之后或任何混合物中进行
(来源:)
因此,所有数据绑定(包括接收新文档的AvalonEdit)都会在没有去初始化/初始化调用的情况下刷新,这将导致异常
理想的解决方案是强制TabControl每次从DataTemplate实例化视图,但视图重用机制似乎是WPF中的一般规则(ContentControl也使用它)。不太理想但仍然可靠的选择是捕获DataContext更改-但我必须在DataContext更改前后可靠地调用代码,这似乎也是不可能的
我怎样才能解决这个问题?如何在WPF中正确维护(初始化/取消初始化)具有复杂视图的文档?请参阅我对以下问题的回答: 我提供了一个解释/理论和一个工作示例,说明了如何使用
x:Shared
属性“完全刷新”DataTemplate
,以及DataTemplateSelector
的实现(我发现这两者都是确保生成新DataTemplate
所必需的)
总结如下:
DataTemplate
需要与x:Shared=“False”
一起位于ResourceDictionary
中DataTemplateSelector
来提供所需资源/模板的模糊性,以确保当前DataTemplate
不会持久化