WPF中切换TabControl标签时绑定的依赖属性值丢失问题
WPF MVVM TabControl切换标签后自定义控件依赖属性绑定异常问题
场景概述
- 基于WPF采用MVVM架构开发应用,主窗口
TabControl的ItemsSource绑定到TabItem对应的ViewModel列表,通过MainWindow中定义的DataTemplates为不同类型ViewModel匹配对应视图,这部分运行正常。 - 其中一个视图包含自定义用户控件,为第三方控件扩展了三个依赖属性,代码如下:
public static readonly DependencyProperty ModelLayerListProperty = DependencyProperty.Register( "ModelLayerList", typeof(LayerKeyedCollection), typeof(ModelDesign), new FrameworkPropertyMetadata(default(LayerKeyedCollection), OnLayerListChanged)); public static readonly DependencyProperty ModelBlockListProperty = DependencyProperty.Register( "ModelBlockList", typeof(List<Block>), typeof(ModelDesign), new FrameworkPropertyMetadata(default(List<Block>), OnBlockListChanged)); public static readonly DependencyProperty ModelEntityListProperty = DependencyProperty.Register( "ModelEntityList", typeof(List<Entity>), typeof(ModelDesign), new FrameworkPropertyMetadata(default(List<Entity>), OnEntityListChanged));
- 关键约束:这三个属性必须按**先设置图层(ModelLayerList)、再设置块(ModelBlockList)、最后设置实体(ModelEntityList)**的顺序赋值,否则第三方控件会抛出异常。
问题现象
- 首次打开标签页时,数据能正确绑定到依赖属性,第三方控件显示正常;
- 切换到其他标签页后再返回当前标签页,虽然运行时ViewModel的所有属性值看起来都正确,但依赖属性变更回调(
OnLayerListChanged/OnBlockListChanged/OnEntityListChanged)的断点显示,事件参数中的新值为null或对应类型的默认值,导致第三方控件无法正常渲染。
已知条件与需求
- 明确TabControl切换标签时会销毁非活动视图的实例,强制缓存视图的方案不可行——ViewModel数据可达数GB,缓存会快速占用大量内存;
- 需求是切换回标签页时,从ViewModel重新渲染数据;
- 考虑过通过交互绑定TabControl的
SelectionChanged事件(不违反MVVM模式),但存在疑问:- 是否需要从数据仓库重新获取数据?
- 还是有办法直接触发视图与ViewModel现有数据的重绑定?
内容的提问来源于stack exchange,提问作者Konradas Stonkus
相关产品推荐
相关产品推荐

