【问题标题】:Providing UI notifications when the ViewModel detects a file permissions issue当 ViewModel 检测到文件权限问题时提供 UI 通知
【发布时间】:2014-05-22 15:42:24
【问题描述】:

作为 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;
    }

【问题讨论】:

  • 善用“新手”这个词!

标签: c# wpf csv mvvm


【解决方案1】:

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

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

更新>>>

我不确定应该如何进行文件检查。如果一个文件被锁定,或未被选中,或已经存在,如何将其传达给 V 以便通知用户?

就 MVVM 而言,您编写文件检查过程的方式很好。你没有违反任何规则。这是实现此类功能的“快速”方式,但当然,编码质量存在不同级别。

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

如果您不进行测试并且不太可能想要更改或添加 Web 界面,那么您确实不需要这种级别的分离。但是,如果您正在开发一个业务应用程序,那么将应用程序的各种关注点分离到不同的文件夹或项目中通常被认为是一种很好的做法;数据访问、数据操作、服务和 UI。

我还有一个HardDriveManager 类,它使我能够从视图模型中执行所有这些System.IO 函数,而无需为相关的dll 添加usings。所以答案是你所做的没问题,但你可以将不同的功能拆分为不同的帮助类。

【讨论】:

  • 是的,这就是我上面提到的“1)”点的意思。当用户按下“设置文件”按钮时,这正是我正在做的事情。我不确定的是我在上面的代码中列出的特殊情况,检查文件是否已被选中、是否存在并被锁定。
猜你喜欢
  • 2022-07-13
  • 2018-11-28
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2021-02-23
  • 1970-01-01
相关资源
最近更新 更多