使用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您需要定義DataTemplates,以便在窗口的Content屬性中設置窗口中創建的相應View。
<DataTemplate DataType="{x:Type viewModel:AViewModel}">
<views:AUserControl />
</DataTemplate>
然後你可以從ViewModel中使用IWindowService,你應該通過構造函數注入來注入它。
這樣你不直接從ViewModel引用框架特定的類。 ViewModel僅對IWindowService有參考。當你想爲視圖模型編寫單元測試時,這也有好處。你可以模擬這個服務,這樣當單元測試運行時它不應該打開一個對話框。
這個回答適用於WPF,而不是UWP。 –