首先要做的事情是,先設置一些上下文。如果您熟悉問題,請跳至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? –