TabControl的DataTemplate中使用AvalonEdit出现跨标签文本同步异常如何解决
异常根本原因
- WPF
TabControl默认采用UI复用逻辑:其内容展示区域仅存在1个ContentPresenter实例,切换标签时不会为每个标签单独生成DataTemplate对应的UI元素,只会复用同一个UI实例,同步更新其DataContext为当前选中标签的数据源。 - AvalonEdit与原生
TextBox的属性实现存在差异:原生TextBox的Text为依赖属性,属性变更、数据上下文变更时都会触发WPF属性系统的自动同步逻辑;但AvalonEdit的Text是普通CLR属性,其内部文本实际存储在TextDocument对象中,该对象默认仅在TextEditor实例化时创建一次,不会跟随DataContext变更自动重置,因此复用同一个TextEditor实例时,上一个标签的文本内容会被保留。
可选解决方案
- 方案1:给
TabControl添加属性IsContentPreserved="True"(.NET Framework 4.5及以上版本支持),关闭内容复用逻辑,每个标签页会保留独立的UI实例。 - 方案2:为每个标签对应的ViewModel创建独立的
TextDocument实例,将avalonEdit:TextEditor的Document依赖属性绑定到ViewModel的对应TextDocument属性,切换标签时会自动替换编辑器绑定的文档对象,实现内容隔离。 - 方案3:自定义TabControl的控件模板,为每个标签页配置独立的内容呈现容器,避免UI复用。
内容的提问来源于stack exchange,提问作者cicatrix
相关产品推荐
相关产品推荐

