2017-03-21 5 views
-1

MVVM-Patternに基づいたWPFアプリケーションがあります。すべて正常に動作します。 View-Modelのビジネスロジックでは、いくつかのダイアログを呼び出す必要があります。私は、インターフェイス(インターフェイスの実装は、ビュー層にあります)を介して実装されています。ダイアログでは親ウィンドウを設定する必要があるので、interfaceの関数に引数 "parentView"があります。MVVMパターンが壊れていますか?

私のViewModelには、親ウィンドウの "オブジェクト"タイプからプロパティ "ビュー"があります。このプロパティは、ダイアログのインスタンス化の引数として配置します。

「ビュー」プロパティはタイプ「オブジェクト」からのものであり、ビューレイヤーから設定され、ビューレイヤーに戻されるため、ビューモデルレイヤーはビューレイヤーに依存しません。

私はMVVMパターンを壊したと思いますか?

答えて

1

私はMVVMパターンを壊したと思いますか?

いいえビューモデルはビューに依存しません。単体テストで簡単にモックできるインターフェースについてのみ知っています。だから、 "View"が何かを抽象化している限り、これは実際にパターンを破るものではありません。

タイプセーフな理由から、おそらくパラメータのタイプをobjectから強く型付けされたインターフェイスタイプに変更することを検討してください。

+0

タイプの安全性に関するヒントをありがとうございます。本当に私は考えています。 – Rekshino

1

友人がいない - これは解決された問題です。 すべてのソリューションに本当の美しさはないが、たとえばDialog-Serviceを使用することができます。

本当に簡単に実装できるのはSingletonで、Main-Windowの静的フィールドがあります。これで、このクラスからDialogを呼び出すことができます。

私は実際には例えばMahAppsはこのように書きますが、彼らはそれを空想方法を登録思う:ここ

<controls:MetroWindow 
     x:Class="SomeMetroWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" 
     xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" 
     Dialog:DialogParticipation.Register="{Binding}"> <!-- watch this pls ---> 
<!-- ... ---> 
</controls:MetroWindow> 

は、一般的な実装のためのexampleです。そしてここに別のarcticleこのトピックのarcticlesについて。

私が言ったように - 本当に美しいわけではありませんが、解決されました。

+1

こんにちはピーター、あなたの答えをありがとう。実際には私のバリアントサービス(少ないコード、柔軟性)の私の作品です。シングルトンに親を置くことは、私にとっては解決策ではありません(時々、異なる親があります)。 – Rekshino

+0

一般的に、私は 'WPF'であなた自身の' DialogService'を書くことをお勧めしません。 Windows-Store-Appsの中には、すでに「ネイティブ」なソリューションがあります。 – Peter

関連する問題