Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在高级数据模板中处理数据上下文更改_C#_Wpf_Datacontext - Fatal编程技术网

C# 在高级数据模板中处理数据上下文更改

C# 在高级数据模板中处理数据上下文更改,c#,wpf,datacontext,C#,Wpf,Datacontext,我正在WPF中编写一个MDI应用程序-文档显示在选项卡中 由于选项卡显示完整的文档,TabControl的DataTemplate显然相当复杂-包括CodeBehind中的一些初始化/去初始化代码(没有黑客攻击-这只是我使用的控件,即AvalonEdit所需要的)。但问题是,TabControl重用了创建的DataTemplate,当我更改活动文档时,只替换DataContext—忽略了在加载/卸载事件中执行的所有初始化/取消初始化过程 我想挂起DataContextChanged事件,但有一个

我正在WPF中编写一个MDI应用程序-文档显示在选项卡中

由于选项卡显示完整的文档,TabControl的DataTemplate显然相当复杂-包括CodeBehind中的一些初始化/去初始化代码(没有黑客攻击-这只是我使用的控件,即AvalonEdit所需要的)。但问题是,TabControl重用了创建的DataTemplate,当我更改活动文档时,只替换DataContext—忽略了在加载/卸载事件中执行的所有初始化/取消初始化过程

我想挂起
DataContextChanged
事件,但有一个陷阱:

当元素的DataContext更改时,此元素上的所有数据绑定属性都可能受到影响。这适用于逻辑树中当前元素的子元素(继承数据上下文)以及当前元素本身。所有这些现有绑定都必须重新解释新的DataContext,并将重新评估绑定结果。相对于DataContextChanged事件的引发,数据绑定引擎无法确定这些重新评估的顺序。重新评估可以在事件之前、事件之后或任何混合物中进行

(来源:)

因此,所有数据绑定(包括接收新文档的AvalonEdit)都会在没有去初始化/初始化调用的情况下刷新,这将导致异常

理想的解决方案是强制TabControl每次从DataTemplate实例化视图,但视图重用机制似乎是WPF中的一般规则(ContentControl也使用它)。不太理想但仍然可靠的选择是捕获DataContext更改-但我必须在DataContext更改前后可靠地调用代码,这似乎也是不可能的


我怎样才能解决这个问题?如何在WPF中正确维护(初始化/取消初始化)具有复杂视图的文档?

请参阅我对以下问题的回答:

我提供了一个解释/理论和一个工作示例,说明了如何使用
x:Shared
属性“完全刷新”
DataTemplate
,以及
DataTemplateSelector
的实现(我发现这两者都是确保生成新
DataTemplate
所必需的)

总结如下:

  • DataTemplate
    需要与
    x:Shared=“False”
    一起位于
    ResourceDictionary

  • 需要使用
    DataTemplateSelector
    来提供所需资源/模板的模糊性,以确保当前
    DataTemplate
    不会持久化