首先要做的事情是,先设置一些上下文。如果您熟悉问题,请跳至BindingExpression
部分。这是我在WPF中的第一个主要项目,所以我对MVVM模式仍然很陌生。 Here是我发现的唯一另外一个类似的问题,它的低调答案并没有真正引起我很大的兴趣。在MVVM应用程序中切换ViewModels时发生BindingExpression路径错误
我有/建立一个.NET 3.5 WPF应用程序,我使用MVVM(自己实现,没有框架)。在此范围内,我有一些Views
和ViewModels
。这些分别位于主人ApplicationView
和ApplicationViewModel
之内。
我更改视图的方式是通过使用XAML的DataTemplate元件在ApplicationView
,像这样:
<DataTemplate DataType="{x:Type viewmodels:InitViewModel}">
<views:InitView />
</DataTemplate>
然后在主体我有结合于场所在ApplicationViewModel
<ContentControl Content="{Binding CurrentPageViewModel}"/>
一个ContentControl中
当我运行该应用程序时,所有这些似乎工作正常,并且完全按照预期操作。但是,当我在运行后查看调试输出时,出现很多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,指出将子视图datacontext设置为{Binding DataContext.CurrentPageViewModel, RelativeSource={RelativeSource AncestorType={x:Type Window}}}
是没有意义的,因为ContentControl负责处理datacontext。
那么你所建议的是直接将datacontext硬编码到每个视图中,而不是绑定到主视图模型中的currentViewModel属性?对我来说,这似乎有点混乱。然而,我认为这个答案可能是迄今为止实际提供解决方案中最接近的3个答案。 –
1:1绑定是最简单的解决方案。查看http://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx高级MVVM模式。 –
by 1:1 binding,你是说Mode = OneTime? –