最简单的方法是实现一个对话框服务并使用依赖注入将服务注入到视图模型中。依赖于接口是可以的,但不要依赖于具体实现。
以下是我使用的接口:
namespace DialogServiceInterfaceLibrary
{
public enum MessageBoxButton
{
OK = 0,
OKCancel = 1,
YesNoCancel = 3,
YesNo = 4,
}
public enum MessageBoxResult
{
None = 0,
OK = 1,
Cancel = 2,
Yes = 6,
No = 7,
}
public enum MessageBoxIcon
{
None = 0,
Error = 16,
Hand = 16,
Stop = 16,
Question = 32,
Exclamation = 48,
Warning = 48,
Information = 64,
Asterisk = 64,
}
public interface IDialogService
{
bool OpenFileDialog(bool checkFileExists,string Filter, out string FileName);
void OpenGenericDialog(object Context,IRegionManager RegionManager);
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon);
}
而实现方式如下:
public class DialogService : IDialogService
{
public bool OpenFileDialog(bool checkFileExists, string Filter, out string FileName)
{
FileName = "";
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.Filter = Filter;
openFileDialog.CheckFileExists = checkFileExists;
bool result = ((bool)openFileDialog.ShowDialog());
if (result)
{
FileName = openFileDialog.FileName;
}
return result;
}
public void OpenGenericDialog(object Context,IRegionManager RegionManager)
{
GenericDialogWindow dlg = new GenericDialogWindow(Context,RegionManager);
dlg.Owner = System.Windows.Application.Current.MainWindow;
dlg.Show();
}
public MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon)
{
return (DialogServiceInterfaceLibrary.MessageBoxResult)System.Windows.MessageBox.Show(message, caption,
(System.Windows.MessageBoxButton)buttons,
(System.Windows.MessageBoxImage)icon);
}
}
然后将IDialogservice注入到viewmodel中。接口和具体实现通常在不同的程序集中。
MainWindowViewModel(IDialogService dialogservice){
_dialogservice = dialogservice;
}
private void ShowUsercontrol()
{
_dialogservice.ShowMessageBox(... //you get what i mean ;-)
}
对话框服务可以打开标准的窗口,例如文件打开对话框。通用版本也可以使用,但是需要了解稍微复杂一些的prism。
Prism还允许使用交互请求在视图模型和视图之间通信。我更喜欢在prism中采用这种工作方式,但是如果您不了解prism,请忽略该备注。对于简单的确认窗口,这样一个简单的对话框服务非常理想。
通过将依赖项注入到视图模型的构造函数中,使您已经朝着使用反转控制容器的正确方向前进。并且可以更轻松地进行单元测试,因为您可以模拟注入的接口以检查它们是否被正确调用等。