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のみが参照されます。これは、ビューモデルの単体テストを書いておきたいときにも有益です。このサービスを模擬して、単体テストの実行中にダイアログを開かないようにすることができます。
この回答は、OPが尋ねるように、UWPではなくWPFに適用されます。 –