切换选项卡时,TabControl中的WPF视图丢失绑定依赖项属性值

z18hc3ub  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(267)

我正在使用MVVM在WPF上编写一个应用程序。我的主窗口中有一个TabControl,它将其ItemSource绑定到TabItem的ViewModel列表。TabItem可以是几种不同的类型,并且给定类型的相应视图是从主窗口中定义的DataTemplates中选择的。所有这些都在这部分上运行良好。
DataTemplates中定义的一个视图中有一个自定义用户控件-我用依赖项属性扩展的第三方控件:

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));

需要注意的是,这些属性必须按特定顺序设置-必须先设置图层,然后设置块,最后设置实体,否则第三方控件将抛出异常。
第一次打开选项卡时,数据会正确地绑定到这些属性,并在视图中显示为应有的样子。每当切换到另一个选项卡然后再切换回来时,问题就会出现-即使在运行时检查ViewModel本身时,所有属性看起来都设置正确,在依赖性属性改变的回调中设置断点显示在事件自变量中接收到的新值是空值或该类型的默认值。
我知道TabControl在切换选项卡时不会将数据持久化在视图中,虽然我见过强制TabControl缓存数据的解决方案,但我希望在打开选项卡时呈现视图模型中的数据--我们可能会显示ViewModel中几GB的数据,这可能会很快占用内存。
我也知道我可以绑定到TabControl SelectionChanged事件(并且不会通过交互破坏MVVM模式),但是我不确定如何将正确的数据重新加载到视图中--我必须再次从我的存储库中获取它吗?或者有什么方法可以从ViewModel本身重新加载/重新绑定数据吗?

2skhul33

2skhul331#

我已经弄明白了,this answer似乎是解决这个问题的最佳选择。显然,尽管在切换选项卡时TabItem通常会被卸载,但如果您在两个具有相同DataTemplate的选项卡之间切换,则控件会被重用(仅数据上下文发生变化!),生命周期事件不会被调用,控件上未绑定的属性也会持续存在。2在你想要重新加载的属性上创建绑定似乎可以达到这个目的。

相关问题