【发布时间】:2013-09-02 06:08:53
【问题描述】:
首先,一些上下文。如果您熟悉该问题,请跳至BindingExpression 部分。这是我在 WPF 中的第一个主要项目,所以我对 MVVM 模式还是很陌生。 Here 是我发现的唯一一个类似的问题,其平淡无奇的回答并没有让我很兴奋。
我已经/正在构建一个 .NET 3.5 WPF 应用程序,并且我正在使用 MVVM(我自己实现,没有框架)。其中,我有许多Views 和ViewModels。它们分别驻留在主控 ApplicationView 和 ApplicationViewModel 中。
我更改视图的方式是通过在ApplicationView 中使用 XAML DataTemplate 元素,如下所示:
<DataTemplate DataType="{x:Type viewmodels:InitViewModel}">
<views:InitView />
</DataTemplate>
然后在主体中我有一个 ContentControl,它绑定到 ApplicationViewModel 中的一个属性
<ContentControl Content="{Binding CurrentPageViewModel}"/>
当我运行应用程序时,所有这些似乎都可以正常工作,并且完全符合预期。但是,当我在运行后查看 Debug 输出时,我得到了很多 BindingExpression 错误。
这是一个例子。我的InitViewModel 中有一个属性SplashText。这绑定到初始屏幕中的文本块 (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 负责处理数据上下文。
【问题讨论】: