0

このタイトルは質問自体には不適切かもしれませんが、私と一緒にいてください  より良い提案があれば変更します。これは私の最初の 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 を変更する必要がありますか? この例でいくつかの重要な情報が欠落していると思われる場合は、お知らせください。更新します。

アドバイスをよろしくお願いします、乾杯!

4

1 に答える 1

1

ページを 1 つのビュー モデルのみに変更することは絶対に避けてください。Messenger はやり過ぎではありません。MVVM Light Messengerは、現在発生している問題 (VM 間の通信) を正確に解決するために構築されています。あなたはそれを使うべきです。

MVVM Light 内のメッセージングの詳細については、Microsoft の Jesse Liberty が、その使用方法に関する優れたチュートリアルを提供しています。

于 2014-08-19T06:11:19.253 に答える