0

我正在使用modelviewviewmodel 实现一个应用程序,我有一个视图,您可以在其中更改对象的所有属性,该对象是视图中视图模型的属性。但它也有像windows一样的菜单栏,文件=>打开,新文件,保存,另存为..如果我点击新文件,应用程序必须创建一个全新的对象。它工作正常,所以对象被重置。每个领域和事物都再次变得空虚。但是现在我想实现一个确认窗口,因为如果用户不小心点击了新文件,他就会失去一切。在那个确认窗口中,我有 2 个按钮,是和否:是的,应用程序会重置所有值,但如果他单击否,窗口就会关闭,用户可以进一步使用当前对象。我的问题是“是”按钮。它是一个窗口,但是创建一个新对象的方法,在我的视图模型中。所以在我的视图模型中是:

 this.Examination = new Examination();

没有确认,我只是从视图模型中的视图转到此方法,但是现在我如何从确认窗口(单击是后)转到我的视图模型?

有人可以帮助我吗?

4

2 回答 2

2

在您的视图模型中创建一个创建新对象的命令并将“是”按钮绑定到该命令。

<Button Command="{Binding CreateNewExaminationCommand, Source={x:Static viewmodel:ExaminationViewModel.Instance}}"></Button>

// VIEWMODEL
    RelayCommand createNewExaminationCommand;
    public ICommand CreateNewExaminationCommand
    {
        get
        {
            if (createNewExaminationCommand== null)
            {
                createNewExaminationCommand= new RelayCommand(param => this.CreateNew(),
                    param => this.CanCreateNew);
            }
            return createNewExaminationCommand;
        }
     }

     private ExaminationViewModel() {}

     private static readonly ExaminationViewModel instance = new ExaminationViewModel();
     public static ExaminationViewModel Instance
     {
           get {return instance;}
     }
于 2011-08-22T17:13:30.380 回答
0

有几种方法可以解决这个问题。

最简单的就是MessageBox.Show在您的视图模型中使用。这易于编码且易于理解。它还破坏了您对视图模型进行单元测试的能力,因为现在它的行为是阻塞并等待用户输入。

复杂性链的下一步是为视图模型定义一个接口,以便在需要询问是或否问题时使用。例如:

public interface IConfirmationDialogService
{
   bool Show(string question);
}

然后您的视图模型实现一个属性:

public IConfirmationDialogService ConfirmationDialogService { get; set; }

当视图模型在您的应用程序中时,您实现了一个服务类供视图模型使用:

public class ViewConfirmationDialogService : IConfirmationDialogService
{
   public string Caption { get; set; }

   public bool Show(string question)
   {
      return MessageBox.Show(
         string question, 
         Caption, 
         MessageBoxButtons.YesNo,
         MessageBoxImage.Question) == MessageBoxResult.Yes;
   }
}

现在在您的视图模型中的任何地方,您都可以从用户那里得到确认:

if (!ConfirmationDialogService.Show("Do you want to do this?"))
{
   return;
}

你如何对此进行单元测试?带着嘲讽。在您的单元测试中,您实现了一个模拟用户输入的类:

public class MockConfirmationDialogService : IConfirmationDialogService
{
   public MockConfirmationDialogService(bool result)
   {
      _Result = result;
   }

   private bool _Result;

   public bool Show(string question)
   {
      return _Result;
   }
}

这样您就可以测试等待用户输入的方法,例如:

MyViewModel vm = new MyViewModel()

ConfirmationDialogService = new MockConfirmationDialogService(false);
vm.ExecuteCommand();
Assert.IsFalse(vm.CommandChangedSomething);

vm.ConfirmationDialogService = new MockConfirmationDialogService(true);
vm.ExecuteCommand();
Assert.IsTrue(vm.CommandChangedSomething);

复杂性的下一步是当您意识到这只是您将在视图模型中实现对话框的众多问题之一,而不是有一个IConfirmationDialogService是或否的问题,您将需要一个更强大的对话服务来处理各种对话。到那时,您将顺利实现自己的视图模型框架,您应该开始查看现有的视图模型框架,看看它们是如何做到的。

于 2011-08-22T20:01:53.303 回答