2017-02-12 7 views
0

これについて正しい方法で考えているかどうかはわかりません。オブジェクトのリストがあり、指定されたオブジェクトのプロパティを編集して表示できるようにしたいと考えています。私の最初の考えは素晴らしいです、私は、テキストボックスを持つダイアログをポップアップし、ユーザーがOKまたはCancelのいずれかを押すまで心臓のコンテンツを編集できるようにします。PrismとUWPを使ってダイアログを行う適切な方法

私はUWPを使用しており、すべてのMVVMニーズにPrismを使用しています。私はしばらく時間がかかりましたが、ビューとそれに関連するViewModel、コマンドなどの作成について理解しています。これまでビュー論理とビジネスロジックを分離しておくと良い仕事をしたと思います。

私は検索しましたが、MVVMの原則に従った方法でダイアログを表示する方法が見つかりませんでした。最もよく出てくるように見える2つの要素は、UWPでPrismを使用していないように見える相互作用要求を使用し、カスタムコンテンツダイアログを作成し、親ビューの関連するメソッドでShowAsyncを呼び出して表示することですViewModel(MVVMの原則に反しているようです)。

XAMLを使用して定義され、関連付けられたViewModel(これは私が慣れ親しんだものに似ていることが好ましいため)を持つダイアログを表示する方法、またはこの問題に対処する方法はありますか?

答えて

0

MVVMを使用すると、ダイアログを開くための適切な場所がViewModelにあります。

通常私はあなたのシナリオでは、このような何か:

は、ダイアログを表示するためのインタフェースを作成します。

public interface IWindowService 
{ 
    void OpenViewModelInWindow(ViewModelBase vm, string title, bool resizeable = true); 
    void CloseViewModelInWindow(ViewModelBase vm); 
} 

UI層にこのインタフェースを実装します。あなたのアプリで

public class WindowService : IWindowService 
{ 
    private List<Window> _windows = new List<Window>(); 

    public void OpenViewModelInWindow(ViewModelBase vm, string title, bool resizeable = true) 
    { 
     var window = new Window 
     { 
      Title = title, 
      Content = vm, 
      Owner = Application.Current.MainWindow, 
      WindowStartupLocation = WindowStartupLocation.CenterOwner, 
      ShowInTaskbar = false, 
      SizeToContent = SizeToContent.WidthAndHeight, 
      ResizeMode = resizeable ? ResizeMode.CanResize : ResizeMode.NoResize 
     }; 
     _windows.Add(window); 
     window.ShowDialog(); 
    } 

    public void CloseViewModelInWindow(ViewModelBase vm) 
    { 
     _windows.Single(w => w.Content == vm).Close(); 
    } 
} 

を。 xamlでは、ウィンドウのContentプロパティを設定したときに、対応するウィンドウがウィンドウ内に作成されるように、DataTemplatesを定義する必要があります。

<DataTemplate DataType="{x:Type viewModel:AViewModel}"> 
    <views:AUserControl /> 
</DataTemplate> 

その後、あなたはコンストラクタ・インジェクションによって、それを注入する必要があり、ViewModelにからIWindowServiceを使用することができます。

このようにして、ViewModelからフレームワーク固有のクラスを直接参照することはありません。 ViewModelには、IWindowServiceのみが参照されます。これは、ビューモデルの単体テストを書いておきたいときにも有益です。このサービスを模擬して、単体テストの実行中にダイアログを開かないようにすることができます。

+0

この回答は、OPが尋ねるように、UWPではなくWPFに適用されます。 –

関連する問題