0

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

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

    OnPropertyChanged("Show Save Dialog"); // in ViewModel

在用户控件后面的代码中,我添加了事件处理程序

    ViewModel.PropertyChanged += new // in code behind of user control
          System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged);

在 ViewModel_PropertyChanged 我有

   switch (e.PropertyName ) // in code behind of user control
        {
            case "Show Save Dialog": ShowSaveFileDialog();// this function shows dialog.
            break;
         }

这在我的情况下工作得很好,但我不知道这个实现的阴暗面。

这样对吗 ????

4

3 回答 3

3

正确的?没有对错,只有当下最好的选择。纯粹主义者的唯一方法是抽象出从界面后面的用户那里获取此类输入的过程,然后创建一个服务于该界面的 View 类并以某种方式注入它(IoC/DI,或者如果你的ViewModel 以这种方式实例化)。

就个人而言,我不会花太多时间担心这个,除非你必须担心这个。我已经做到了两种方式。对于您的普通 MVVM 应用程序,我认为仅使用 MessageBox、OpenFileDialog 等并没有什么大不了的。对于经过大量测试的应用程序,您需要将其抽象出来。还有其他情况也需要它。例如,我的代码存在于应用程序和 Visual Studio 扩展中。VS 有自己的对话框类型,应该使用它来代替 MessageBox。所以抽象是合适的。但除非我有理由,否则我不会投资这项工作。

于 2011-08-09T14:18:06.593 回答
1

为什么不创建一个自定义事件?在您的 ViewModel 中是这样的:

public event EventHandler<EventArgs> ShowSaveDialog;

然后使用

ViewModel.ShowSaveDialog += OnShowSaveDialog;

private void OnShowSaveDialog(object sender, EventArgs e){
    //handle the event
}

我不会像那样“滥用”PropertyChanged。您的实现可能没有任何问题,只是感觉不对。此外,您正在使用魔术字符串,但如果您有自定义事件,则它更具声明性,并且您的代码的其他用户会立即发现有一种订阅此事件的方法。
如果您需要传递额外的信息,请实现EventArgs并添加您需要的属性。

于 2011-08-09T14:00:16.987 回答
1

正如威尔所说,没有对错……只有最佳选择!

就个人而言,我更倾向于纯粹主义的一面,并尝试构建一个系统以明确分离关注点......但这只是我!

这是我对与您的问题相同的帖子给出的答案。当您希望保持视图模型不包含任何视图代码时,我将展示两种当前浮动的方法。

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

于 2011-08-09T14:25:25.697 回答