首先,一些背景。如果您熟悉该问题,请跳至该BindingExpression
部分。这是我在 WPF 中的第一个主要项目,所以我对 MVVM 模式还是很陌生。这是我发现的唯一一个类似的问题,其平淡无奇的答案并没有真正让我兴奋。
我已经/正在构建一个 .NET 3.5 WPF 应用程序,并且我正在使用 MVVM(我自己实现,没有框架)。在此范围内,我有许多Views
和ViewModels
。它们分别驻留在主控器ApplicationView
中ApplicationViewModel
。
我更改视图的方式是通过在 中使用 XAML DataTemplate 元素ApplicationView
,如下所示:
<DataTemplate DataType="{x:Type viewmodels:InitViewModel}">
<views:InitView />
</DataTemplate>
然后在主体中我有一个 ContentControl 绑定到一个属性ApplicationViewModel
<ContentControl Content="{Binding CurrentPageViewModel}"/>
当我运行该应用程序时,所有这些似乎都工作正常,并且完全符合预期。但是,当我在运行后查看 Debug 输出时,我得到了很多BindingExpression
错误。
这是一个例子。我SplashText
在我的InitViewModel
. InitView
这与初始屏幕 ( )中的文本块绑定。当启动画面结束并关闭视图模型时,我得到以下信息:
System.Windows.Data Error: 39 : BindingExpression path error: 'SplashText' property not found on 'object' ''MainMenuViewModel' (HashCode=680171)'. BindingExpression:Path=SplashText; DataItem='MainMenuViewModel' (HashCode=680171); target element is 'TextBox' (Name='FeedBackBox'); target property is 'Text' (type 'String')
我知道这是因为绑定仍然存在,但 DataContext 的 CurrentPageViewModel 属性已更改。所以我想知道的是:
- 这是一个转瞬即逝的问题,即视图在不使用时被处理掉还是它们(以及不良绑定)无限期地存在于内存中?
- 有没有办法在视图处于非活动状态时清理或停用这些绑定?
- 如果我不理会这些,会对我的应用程序产生什么样的性能影响?
- 有没有更好的切换视图的方法来避免这个问题?
在此先感谢,并为这个单一的问题道歉。
编辑 03/09/13 - 感谢 Jehof、Francesco De Lisi 和 Faster Solutions 指出设置子视图数据上下文是没有意义的,{Binding DataContext.CurrentPageViewModel, RelativeSource={RelativeSource AncestorType={x:Type Window}}}
因为 ContentControl 负责处理数据上下文。