当ViewModel检测到文件权限问题时,提供UI通知

本文关键字:提供 UI 通知 问题 权限 ViewModel 检测 文件 | 更新日期: 2023-09-27 18:04:50

作为c#, WPF和MVVM的新手,我正在重构我的第一个应用程序原型,从一个几乎完全在代码后实现的组装到MVVM模式。一切都运行良好:数据绑定、命令等。几乎所有的东西都被移动到正确的位置,但我遇到了一点问题,试图找出我应该如何处理文件。

我的模型支持向远程电子设备发送和读取的数据块。该数据在VM中进行转换,并通过绑定与V交换。用户可以选择流输出到CSV。这可以通过OpenFileDialog或直接在文本框中输入文件名来完成。

有两点我比较确定(如果你不同意请纠正我):

1)在V中处理OpenFileDialog并通过绑定将文件名发送到MV是可以接受的。我在其他讨论中看到过这个问题的答案。

2)我将实现一个文件处理程序类,它将打开文件,检查权限,格式化CSV记录等。

我不确定的是文件检查应该如何发生。如果一个文件被锁定,或者没有被选中,或者已经存在,如何将这些信息传达给V,以便通知用户?在我对应用程序的第一次剪辑中,我只是在代码背后实现了这个逻辑,这似乎是不正确的:

    private bool CSVReady()
    {
        if (filenameTextbox.Text == "<no file selected>")
        {
            MessageBox.Show("Please select an output file.");
            return false;
        }
        if (File.Exists(filenameTextbox.Text))
        {
            var r = MessageBox.Show("File already exists.  Append to it?",
                    "File Warning",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Warning);
            if (r == MessageBoxResult.No)
                return false;
            try
            {
                File.OpenWrite(filenameTextbox.Text).Close();
            }
            catch (IOException)
            {
                MessageBox.Show("File is already open.  Please close it.");
                return false;
            }
        }
        else // file does not exist, create it and initialize the column labels.
        {
            if ((MessageBox.Show("File does not exist.  Create it?", "File Creation", MessageBoxButton.YesNo, MessageBoxImage.Warning) ==
                MessageBoxResult.No))
                return false;
            File.Create(filenameTextbox.Text).Close();
            File.AppendAllText( // Blah blah blah
        }
        return true;
    }

当ViewModel检测到文件权限问题时,提供UI通知

如果您已经正确地将视图模型的实例绑定到视图的DataContext属性,那么您可以从视图的代码中简单地访问视图模型,如下所示:

...
DialogResult result = fileDialog.ShowDialog();
if (result == DialogResult.OK) filePath = fileDialog.FileName;
...
ViewModel viewModel = (ViewModel)DataContext; //  <--------
viewModel.DoSomethingWithNewFilePath(filePath);

更新>>>

我不确定的是文件检查应该如何发生。如果一个文件被锁定,或者没有被选中,或者已经存在,如何将这些信息传达给V,以便通知用户?

就MVVM而言,您编写文件检查过程的方式是好的。你没有违反任何规定。这是实现这些功能的"快速"方法,但当然,编码质量有不同的水平。

在我的应用程序中,我有xxxManager类为我执行各种功能…有些人可能称之为服务课程。因此,我有一个WindowManager类来处理所有Window相关的任务,包括显示MessageBox e和各种对话框。这样做的原因是我可以为这些类提供接口,并为测试提供模拟实现,这样测试就不会真正打开需要有人关闭的Window

如果你不测试,不太可能想要改变或添加一个web界面,那么你真的不需要那个级别的分离。但是,如果您正在处理业务应用程序,那么将应用程序的各种关注点分离到不同的文件夹或项目中通常被认为是一种良好的做法;数据访问、数据操作、服务和UI。

我还有一个HardDriveManager类,它使我能够从视图模型中执行所有这些System.IO功能,而不必为相关的dll添加using。所以答案是,你所做的是可以的,但是你可以把不同的功能分成不同的助手类。