【发布时间】:2011-03-16 23:48:14
【问题描述】:
我有一个窗口,它使用 DataTemplates 根据其 Content 属性的类型在 ContentPresenter 中显示不同的 UserControl(视图),该属性绑定到保存当前视图模型的属性。这样,通过使用事件更改 viewmodel 属性,我可以方便地进行我需要的基本后退/前进导航。
创建新视图模型时,会传递对当前视图模型的引用。回到旧的视图模型实例对于 CheckBox 控件可以正常工作,但对于我制作的包含 TextBlock 和 ComboBox 的 UserControl 则不行。
问题是,当包含 ComboBox 的视图被卸载时,ComboBox 的 ItemsSource 被清空,这会触发它清除其 SelectedItem/Text 属性,这些属性由于某种原因仍绑定到我的视图模型——从而清除数据它存储。我不知道如何在适当的时候手动解除绑定。 (同样,CheckBox 工作正常。)
我读到其他用户也遇到过同样的问题。对于他们来说,更改 ItemsSource 和 SelectedItem/Text 绑定的声明顺序,以便将后者的属性放置在前者解决问题之前。但是,就我而言,事实并非如此。其他人也通过忽略空值/空值解决了这个问题,但这在我的情况下不起作用。
我可以通过将感兴趣的数据复制到单独的对象并从中重新加载来解决此问题,但我需要添加代码以触发重新加载数据 = 需要维护更多数据链接代码。
我还可以避免使用 DataTemplates 并在代码隐藏中手动添加 UserControl,这样我就可以在删除 UserControl 之前中断数据绑定。但这与 MVVM 的观点背道而驰。
我不会修改我的非 MVVM UserControl 来处理它包含的 ComboBox 上的任何事件以解决此问题。
更新:
我已经稍微缩小了这个问题的范围。我重构了代码,以便它根据已设置的视图模型手动创建和添加视图 UserControl。现在仅当我将视图 UserControl 的 DataContext 设置为 null 时才会出现此问题。如果我只是在不删除引用的情况下替换视图,它就不再删除有问题的值。这是一个可用的解决方法,还是会产生内存泄漏等问题?
【问题讨论】: