使用OnPropertyChange在MVVM中打开“保存文件”对话框是否正常

使用OnPropertyChange在MVVM中打开“保存文件”对话框是否正常,mvvm,mvvm-light,mvvm-foundation,Mvvm,Mvvm Light,Mvvm Foundation,我正在开发绘画应用程序,我需要保存我的绘画。 为了保存,我需要显示“保存文件”对话框,因为我正在实现MVVM模式,所以不能直接使用事件处理程序。 但在实现时,我想到了使用PropertyChanged事件directoly 我已经在ViewModel中实现了INotifyPropertyChanged,我已经绑定了所有命令。 在ViewModel中的save命令中,我调用了 OnPropertyChanged("Show Save Dialog"); // in ViewModel 在

我正在开发绘画应用程序,我需要保存我的绘画。 为了保存,我需要显示“保存文件”对话框,因为我正在实现MVVM模式,所以不能直接使用事件处理程序。 但在实现时,我想到了使用PropertyChanged事件directoly

我已经在ViewModel中实现了INotifyPropertyChanged,我已经绑定了所有命令。 在ViewModel中的save命令中,我调用了

    OnPropertyChanged("Show Save Dialog"); // in ViewModel
在用户控件的代码隐藏中,我添加了事件处理程序

    ViewModel.PropertyChanged += new // in code behind of user control
          System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged);
在ViewModel_Property中,我已经更改了

   switch (e.PropertyName ) // in code behind of user control
        {
            case "Show Save Dialog": ShowSaveFileDialog();// this function shows dialog.
            break;
         }
这在我的情况下很好,但我不知道这个实现的黑暗面


是否正确???

为什么不创建一个自定义事件?在ViewModel中类似于以下内容:

public event EventHandler<EventArgs> ShowSaveDialog;
我不会就这样“滥用”财产。您的实现可能没有什么问题,只是感觉不对劲。此外,您正在使用魔术字符串,但如果您有一个自定义事件,它将更具声明性,您的代码的其他用户将立即找到订阅此事件的方法。

如果需要传递额外的信息,那么实现
EventArgs
并添加所需的属性。

为什么不创建一个自定义事件呢?在ViewModel中类似于以下内容:

public event EventHandler<EventArgs> ShowSaveDialog;
我不会就这样“滥用”财产。您的实现可能没有什么问题,只是感觉不对劲。此外,您正在使用魔术字符串,但如果您有一个自定义事件,它将更具声明性,您的代码的其他用户将立即找到订阅此事件的方法。

如果需要传递额外的信息,那么实现
EventArgs
并添加所需的属性。

对吗?没有对错,只有当下最好的选择。对于纯粹主义者来说,唯一的方法是抽象出从接口后面的用户那里获取此类输入的过程,然后创建一个为该接口服务的视图类,并以某种方式将其注入(IoC/DI,或者如果您的视图模型是以这种方式实例化的,则可能通过xaml中的组合)


就我个人而言,我不会花太多时间担心这件事,除非你必须担心这件事。我两方面都做过。对于一般的MVVM应用程序,我认为仅仅使用MessageBox、OpenFileDialog等并不是什么大犯罪。对于经过大量测试的应用程序,您需要将其抽象出来。还有其他一些情况也需要这样做。例如,我的代码存在于应用程序和VisualStudio扩展中。VS有自己的对话框类型,应该使用它来代替MessageBox。因此,抽象是合适的。但除非我有理由,否则我不会投资这项工作。

对吗?没有对错,只有当下最好的选择。对于纯粹主义者来说,唯一的方法是抽象出从接口后面的用户那里获取此类输入的过程,然后创建一个为该接口服务的视图类,并以某种方式将其注入(IoC/DI,或者如果您的视图模型是以这种方式实例化的,则可能通过xaml中的组合)

就我个人而言,我不会花太多时间担心这件事,除非你必须担心这件事。我两方面都做过。对于一般的MVVM应用程序,我认为仅仅使用MessageBox、OpenFileDialog等并不是什么大犯罪。对于经过大量测试的应用程序,您需要将其抽象出来。还有其他一些情况也需要这样做。例如,我的代码存在于应用程序和VisualStudio扩展中。VS有自己的对话框类型,应该使用它来代替MessageBox。因此,抽象是合适的。但除非我有理由,否则我不会投资这项工作。

正如我所说,没有对错。。。只有最好的选择

就我个人而言,我更倾向于纯粹主义的一面,并试图构建一个系统,以清晰地分离关注点。。。但那只是我

我给了一个和你处理同样问题的职位。在这里,当您希望保持视图模型中没有任何视图代码时,我展示了两种当前的方法

但同样,选择最适合您需要/偏好的方式正如我所说,没有对错。。。只有最好的选择

就我个人而言,我更倾向于纯粹主义的一面,并试图构建一个系统,以清晰地分离关注点。。。但那只是我

我给了一个和你处理同样问题的职位。在这里,当您希望保持视图模型中没有任何视图代码时,我展示了两种当前的方法

但同样,选择最适合您需要/偏好的方式