我正在开发绘画应用程序,我需要保存我的绘画。 为了保存我需要显示保存文件对话框,因为我正在实现MVVM模式我不能直接使用事件处理程序。 但实现时我想到使用PropertyChanged事件直接。
我在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_PropertyChanged中我有
switch (e.PropertyName ) // in code behind of user control
{
case "Show Save Dialog": ShowSaveFileDialog();// this function shows dialog.
break;
}
这在我的情况下工作正常,但我不知道这个实现的黑暗面。
是不是????
答案 0 :(得分:3)
右?没有对错,只是目前最好的选择。纯粹主义者的唯一方法是抽象出从界面后面的用户那里获得这种输入的过程,然后创建一个View类,它为这个界面提供服务并以某种方式注入它(IoC / DI,或者如果你的话,可能是xaml中的组合ViewModels以这种方式实例化。
就个人而言,我不会花太多时间担心这一点,除非你必须担心这个。我已经做到了两个方面。对于普通的MVVM应用程序,我认为使用MessageBox,OpenFileDialog等并不是一件容易的事。对于经过严格测试的应用程序,您需要将其抽象出来。还有其他情况也需要它。例如,我有一个存在于应用程序和Visual Studio扩展中的代码。 VS有自己的对话框类型,应该使用它们代替MessageBox。所以抽象是合适的。但除非我有理由,否则我不会投入工作。
答案 1 :(得分:1)
为什么不创建自定义事件?在ViewModel中有类似的东西:
public event EventHandler<EventArgs> ShowSaveDialog;
然后使用
ViewModel.ShowSaveDialog += OnShowSaveDialog;
private void OnShowSaveDialog(object sender, EventArgs e){
//handle the event
}
我不会像这样“滥用”PropertyChanged。你的实现可能没什么问题,只是感觉不对。此外,您正在使用魔术字符串,但如果您有自定义事件,那么它将更具说明性,并且您的代码的其他用户将立即发现有一种方式可以订阅此事件。
如果您需要传递额外信息,请执行EventArgs
并添加所需的属性。
答案 2 :(得分:1)
好Will说没有对错......只有最好的选择!
就个人而言,我更倾向于纯粹的一面,并试图建立一个系统,以明确分离关注点...但这只是我!
Here is an answer我给了一个处理同样问题的帖子。在那里,当你想让视图模型保持清晰的任何视图代码时,我展示了两种当前的方法。
但同样,选择最适合您需求/偏好的方式!