首先,先了解一些背景。如果您熟悉该问题,请跳至BindingExpression
部分。这是我在 WPF 中的第一个主要项目,所以我对 MVVM 模式还很陌生。Here https://stackoverflow.com/questions/16221021/mvvm-binding-expression-errors-when-createing-a-view-in-xaml-with-a-viewmodel这是我发现的唯一一个类似的问题,其乏善可陈的答案并没有真正让我兴奋。
我已经/正在构建一个 .NET 3.5 WPF 应用程序,并且正在使用 MVVM(我自己实现,没有框架)。其中,我有一些Views
and ViewModels
。这些位于主控内ApplicationView
and ApplicationViewModel
分别。
我更改视图的方式是通过使用 XAML DataTemplate 元素ApplicationView
,像这样:
<DataTemplate DataType="{x:Type viewmodels:InitViewModel}">
<views:InitView />
</DataTemplate>
然后在主体中我有一个 ContentControl ,它绑定到ApplicationViewModel
<ContentControl Content="{Binding CurrentPageViewModel}"/>
当我运行该应用程序时,所有这些似乎都工作正常,并且完全符合预期。然而,当我查看运行后的调试输出时,我得到了很多BindingExpression
errors.
这是一个例子。我有一处房产,SplashText
, in my 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 负责处理数据上下文。