我不确定我是否以正确的方式思考这个问题。我有一个对象列表,我希望用户能够编辑和查看指定对象的属性。我最初的想法很棒,我会弹出一个包含文本框的对话框,让用户编辑他们内心的内容,直到他们按下确定或取消。
我在UWP上,并使用Prism满足我的所有MVVM需求。它花了我一段时间,但我理解创建视图及其相关的ViewModel,命令等。到目前为止,我认为我已经做好了将视图逻辑和业务逻辑分开的工作。
我已经搜索过了,但是还没有找到如何以符合MVVM原则的方式展示对话框。似乎最常出现的两件事是使用交互请求(在UWP上使用Prism似乎不存在),创建自定义内容对话框并通过在父方法中调用ShowAsync来显示它视图的相关ViewModel(这似乎与MVVM原理相反)。
那么,我如何显示一个使用XAML定义的对话框并且具有关联的ViewModel(因为它与我熟悉的类似,所以更好),或者我可以用另一种方法来解决这个问题?
答案 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。当您想要对视图模型进行单元测试时,这也有好处。您可以模拟此服务,以便在单元测试运行时不应打开对话框。