2017-02-07 11 views
0

私はボタンをクリックすると表示されるビューを持っています。新しいウィンドウのビューモデルに観測可能なコレクションを渡したいウィンドウを開きたいと思います。それは働いているが、私はそれがmvvmパターンかどうかわからないコードです。mvvmを使用して新しいウィンドウを開き、コレクションをviewmodelに渡します

ViewCode:

NewWindow newWindowDialog; 
newWindowDialog = new NewWindow() 
{ 
    newWindowDialogCollection = suppliersList, 
    Owner = Application.Current.MainWindow 
}; 
newWindowDialog.ShowDialog(); 

メソッドによりNewWindowダイアログコード:XAMLで

public partial class NewWindow : Window 
{ 
    public NewWindow() 
    { 
     InitializeComponent(); 
     newWindowDialogCollection = new ObservableCollection<SModel>(); 
     DataContext = this; 
    } 
    public ObservableCollection<ISupplierModel> newWindowDialogCollection { get; set; } 
} 

"newWindowDialogCollectionは"

を結合するための私のデータソースとして動作しかし、私はないです上記の方法が正しいことは確かです新しいウィンドウを開き、コレクションを渡すように促す。私は純粋なmvvm & viewmodelでそれをしたいと思います。 あなたの考えを教えてください

答えて

0

ビューモデルで新しいウィンドウを作成すると、ViewModelレイヤーが強く結合され、MVVMの目的に反します。

また、ビューにビジネスデータを持たせるのではなく、代わりにViewModelでダイアログを使用することもできます。

MVVMフレームワークの中には、モデル、ビュー、またはViewModelで(容易に)管理できないすべてのサービスクラスを実装するものがあります。ダイアログを表示することがその1つです。

私はCatelの例を使って説明します。

public MyViewModel(IUIVisualizerService visualizerService) 
{ 
    this._visualizerService = visualizerService; 
} 

そしてCatelは内部ビューとのviewmodelsに一致しているので、新しいダイアログを開くために、あなたは簡単なダイアログののviewmodelを作成し、適切な解決: Catelはあなたのviewmodelのコンストラクタで注入できること、IUIVisualizerServiceインタフェースを提供していますビュー。あなたが喜ばとしてこのように、あなたはあなたのviewmodelのコンストラクタにデータを渡すことができます

var viewModel = new MyViewModel(suppliersList); 
_visualizerService.Show(viewModel); 
0

あなたは、ウィンドウのオープンのために責任があるウィンドウサービスを作成し、そのようなサービスを使用してビューモデルを注入できます。その後、例えば、あなたのビューモデルからウィンドウを開くために、サービスののShowWindowメソッドを呼び出します。

サービス:

public interface IWindowService 
{ 
    void ShowWindow(ObservableCollection<string> collection); 
} 

public class WindowService : IWindowService 
{ 
    public void ShowWindow(ObservableCollection<string> collection); 
    { 
     NewWindow newWindowDialog = new NewWindow() 
     { 
      newWindowDialogCollection = collection, 
      Owner = Application.Current.MainWindow 
     }; 
     newWindowDialog.ShowDialog(); 
    } 
} 

ビューモデル:

public class ViewModel 
{ 
    private readonly IWindowService _service; 
    public ViewModel(IWindowService service) 
    { 
     _service = service; 
    } 

    //... 
    public void OpenCommandExecuted() 
    { 
     _service.ShowWindow(_theCollectionToPass); 
    } 
} 

このアプローチにビューを使用しますモデルは、インターフェイスの模擬実装を提供することで、実際にウィンドウを開かずに簡単に単体テストできるインターフェースについてしか知りません。

+0

どうすればいいですか?newWindowDialogCollection =コレクション、私はbeacuseの背後にあるウィンドウコードで "newWindowDialogCollection"を取る必要があります。主な目的は今コレクションが新しいウィンドウに行く方法です。 – stylishCoder

+0

コレクションへの参照をShowWindowメソッドに渡してプロパティを設定しますNewWindowまたはそのビューモデルをWindowServiceクラスのこのコレクションに追加します。 – mm8

関連する問題