编程语言
首页 > 编程语言> > c#-用于“强制” MVVM的视图模型的单独项目:如何打开对话框?

c#-用于“强制” MVVM的视图模型的单独项目:如何打开对话框?

作者:互联网

在遵循MVVM模式的同时打开对话框似乎是常规问题之一(此处和其他位置).我知道有像MVVM light这样的框架可以解决这个问题,但是我目前正在从事一个非常小的个人项目,在该项目中,我尝试自己做大部分工作,以达到学习目的.

为了“强迫”我自己注意参考,我决定从UI项目中提取视图模型,并将其放入单独的程序集中. UI项目引用UI.ViewModels,但并非相反.这导致我在打开(模式)对话框窗口时遇到问题.

许多人似乎正在使用DialogService来执行以下操作:

internal class DialogService : IDialogService
{
  public bool? OpenDialog(ViewModelBase vm)
  {
    Window window = new Window();
    window.Content = vm;
    return window.ShowDialog();
  }
}

可以使用DataTemplate从视图模型类型推断相应的窗口内容.

但是在我的场景中,由于DialogService必须位于UI项目中,因此这是行不通的,但是我必须从视图模型中调用它.我当然可以滥用DI / IoC将IDialogService实现注入到我的视图模型中,但这不是我想要做的.

有什么严格的方法可以使它起作用吗?

作为替代,我将以下代码添加到我的ViewModelBase中:

public abstract class ViewModelBase : INotifyPropertyChanged
{
  ...

  public event Action<ViewModelBase, Action<bool?>> Navigate;

  protected virtual void OnNavigate(ViewModelBase vm, Action<bool?> callback)
  {
    Navigate?.Invoke(vm, callback);
  }
}

显然,可能会有更多的重载,其他参数,EventArgs等.我可能也应该将其放入界面中.到目前为止,这只是一个“想法”.

创建视图实例时(通过解析或例如在NavigationService中,请参见下文),我可以让NavigationService订阅该事件并调用回调.这是一个有问题的/坏主意吗?这有什么弊端?到目前为止(无需进行大量测试),我不喜欢的一件事是打开对话框后无法继续下一行,而必须在回调代码中继续进行.这也使得通过阅读代码来遵循程序流程变得更加困难.

任何输入,不胜感激!这是一个非常有趣的话题,并且由于对SO的这些问题有很多答案已经过时,我希望了解有关当前最佳实践的更多信息:)

解决方法:

为什么将实现IDialogService的类注入视图模型会滥用IoC?我认为这是个好方法.

不要想太多,将视图和逻辑项目分开是个好主意,只要使用适合您的方法即可.

在上一个项目中,我使用了ReactiveUI框架中的Interaction类.它可以很好地与对话框和文件选择器一起使用.我认为它与您的选择非常相似,您可以检查codeexamples.

它使用的是Reactive Extensions,但您应该了解一下.

标签:modal-dialog,wpf,c,mvvm
来源: https://codeday.me/bug/20191111/2022514.html