このタイトルは質問自体には不適切かもしれませんが、私と一緒にいてください より良い提案があれば変更します。これは私の最初の wpf アプリケーションであるため、いくつかの重要な概念を見逃している可能性があります... Google で調べましたが、正しいアプローチを見つけることができませんでした。
MvvM Light と MUI を使用して wpf アプリケーションを構築していますが、アイテム バインディング、つまりビュー モデル間の通信で問題が発生しました。現在、ページとその中のすべてのユーザー コントロールに単一のビュー モデルを使用した場合、この問題は発生しないと確信していますが、最初の試行ではやり過ぎたと思います。
ユーザーコントロールとして、アプリケーションとページにメインウィンドウが1つあります。各ページには、他のいくつかのユーザー コントロールがあり、それぞれに独自のビュー モデルと独自の処理ロジックがありますが、最終的にはすべて、データ グリッドを備えた対応する VM に依存します。それらは、貧弱な角度のディレクティブと考えることができます。各ユーザー コントロールには、次のように定義されたデータ コンテキストがあります。
DataContext="{Binding ViewModelName, Source={StaticResource Locator}}
レイアウトは次のようになります。 Wpf レイアウト こう 見ると、VM1 の DG1 がマスター (顧客) で、UC3 と UC4 が詳細 (注文) です。顧客に新しい注文を追加する場合、グリッド全体を更新せずに DG1 で更新したいと考えています。
VM1 Data Grid 1 の選択が変更されました。依存するユーザー コントロールのプロパティ値を設定するコマンドを実行しています。
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<mvvm:EventToCommand Command="{Binding ErrorWorkflow.GetErrorWorkflowCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError.WF_REF}" />
<mvvm:EventToCommand Command="{Binding ErrorDetails.GetErrorCaseDetailsCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError}" />
</i:EventTrigger>
</i:Interaction.Triggers>
その部分は問題なく動作しますが、依存する VM3 で VM3 と VM1 の両方の値を変更すると、RaisePropertyChanged を呼び出したり、SelectedError.Status = “somethingnew” のように手動でプロパティを明示的に設定したりしても、VM1 プロパティの値は変更されません。
一方、データ グリッドから選択を解除すると、依存するビュー モデルはバインドされたままになります (それらのテキスト ボックスは、独自の VM3 のプロパティを参照しているため、値を保持します)。
すべてのビュー モデルは、mvvmLight の ViewModelBase と ObservableObjects のすべてのモデルから派生します (Poco を使用する必要があることはわかっていますが、VM にも各プロパティを作成する必要があるようです)。例:
public const string SelectedErrorPropertyName = "SelectedError";
private ErrorLog _selectedError;
public ErrorLog SelectedError
{
get
{
return _selectedError;
}
set
{
Set(() => SelectedError, ref _selectedError, value);
}
}
アプリケーションのサイズを考えると、Messenger はやり過ぎだと思います (このようなページは数ページしかありません)。
View Model を 1 つだけ使用して各ユーザー コントロールで共有するように Page を変更する必要がありますか? この例でいくつかの重要な情報が欠落していると思われる場合は、お知らせください。更新します。
アドバイスをよろしくお願いします、乾杯!