まず最初に、いくつかのコンテキスト。問題に精通している場合は、BindingExpression
部分にスキップしてください。これはWPFでの私の最初の主要なプロジェクトなので、私はまだMVVMのパターンにはまったく新しいです。 Hereは私が見つけた唯一の他の同様の質問であり、その不潔な答えが本当に私をあまり熱狂させない。MVVMアプリケーションでViewModelsを切り替えるときのBindingExpressionパスエラー
私は.NET 3.5 WPFアプリケーションをビルドしていますが、私はMVVM(自分自身、フレームワークは実装されていません)を使用しています。この中で、私はViews
とViewModels
の番号を持っています。これらはそれぞれマスターApplicationView
とApplicationViewModel
の中にあります。
私は、ビューを変更する方法はそうのように、ApplicationView
でXAMLのDataTemplate要素を使用している:
<DataTemplate DataType="{x:Type viewmodels:InitViewModel}">
<views:InitView />
</DataTemplate>
そして本体に私はApplicationViewModel
<ContentControl Content="{Binding CurrentPageViewModel}"/>
内のプロパティにバインドするContentControlにを持っています
私はアプリケーションを実行すると、これはすべて正常に動作するように見え、まさに意図されているとおりです。しかし、実行後にデバッグ出力を見ると、多くのエラーが発生します。BindingExpression
たとえば、これは1つです。私は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プロパティが変更されました:スプラッシュ画面が終了し、私はのviewmodelを切り替えると、私は次の取得します。それでは、私が知りたいことは次のとおりです。
- これはつかの間の問題であり、すなわちビューが使用されていないときに処分されるか、または(と悪いバインディング)が無期限にメモリ内にそこに座っていますか?
- ビューが非アクティブな間にこれらのバインディングをクリーンアップまたは非アクティブ化する方法はありますか?
- これらを単独で放置すると、アプリケーションにどのようなパフォーマンスノックが発生しますか?
- この問題を回避するビューを切り替えるより良い方法はありますか?
ご協力いただきありがとうございました。モノリシックな質問に対してお詫び申し上げます。
Edit 03/09/13 Jehof、Francesco De Lisi、およびFaster Solutionsのおかげで、ContentControlがdatacontextを処理するため、サブビューdatacontextを{Binding DataContext.CurrentPageViewModel, RelativeSource={RelativeSource AncestorType={x:Type Window}}}
と設定することは意味がないことを指摘してください。
それでは、マスタービューモデルのcurrentViewModelプロパティにバインドするのではなく、各ビューにデータコンテキストを直接ハードコードすることをお勧めしますか?私にとっては、ちょっと混乱しているようです。しかし、私はこの答えは実際には解決策を提供するためにおそらく3の中で最も近いと思う。 –
1:1バインディングは最も簡単なソリューションです。高度なMVVMパターンについては、http://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspxを参照してください。 –
1:1バインディングで、Mode = OneTimeを意味しますか? –