まず最初に、いくつかのコンテキスト。問題に精通している場合は、そのBindingExpression
部分までスキップしてください。これは WPF での最初の主要なプロジェクトであるため、MVVM パターンにはまだ慣れていません。これは、私が見つけた唯一の他の同様の質問です。その精彩を欠いた答えは、私をあまり興奮させません。
私は .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}"/>
アプリケーションを実行すると、これらすべてが正常に動作しているように見え、意図したとおりに動作します。ただし、実行後にデバッグ出力を見ると、多くの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 - ContentControl が datacontext を処理するため、サブビュー datacontext を設定するのは無意味であることを指摘してくれた Jehof、Francesco De Lisi、および Faster Solutions に感謝します{Binding DataContext.CurrentPageViewModel, RelativeSource={RelativeSource AncestorType={x:Type Window}}}
。