使用Prism和UWP进行对话的正确方法

时间:2017-02-12 17:20:26

标签: mvvm uwp prism

我不确定我是否以正确的方式思考这个问题。我有一个对象列表,我希望用户能够编辑和查看指定对象的属性。我最初的想法很棒,我会弹出一个包含文本框的对话框,让用户编辑他们内心的内容,直到他们按下确定或取消。

我在UWP上,并使用Prism满足我的所有MVVM需求。它花了我一段时间,但我理解创建视图及其相关的ViewModel,命令等。到目前为止,我认为我已经做好了将视图逻辑和业务逻辑分开的工作。

我已经搜索过了,但是还没有找到如何以符合MVVM原则的方式展示对话框。似乎最常出现的两件事是使用交互请求(在UWP上使用Prism似乎不存在),创建自定义内容对话框并通过在父方法中调用ShowAsync来显示它视图的相关ViewModel(这似乎与MVVM原理相反)。

那么,我如何显示一个使用XAML定义的对话框并且具有关联的ViewModel(因为它与我熟悉的类似,所以更好),或者我可以用另一种方法来解决这个问题?

1 个答案:

答案 0 :(得分: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();
    }
}

在App.xaml中,您需要定义DataTemplates,以便在设置窗口的Content属性时在窗口中创建相应的View。

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

然后你可以使用ViewModel中的IWindowService,你应该通过构造函数注入来注入它。

这样,您就不会直接从ViewModel引用特定于框架的类。 ViewModel仅引用IWindowService。当您想要对视图模型进行单元测试时,这也有好处。您可以模拟此服务,以便在单元测试运行时不应打开对话框。