【发布时间】:2020-01-23 03:37:14
【问题描述】:
我是 WPF 和 MVVM 的新手,我需要创建一个简单的对话框功能,允许我在屏幕上弹出确认消息,例如“确认删除?” y/n 按钮。我为此创建了一个对话服务(本质上是一个简单的 System.Windows.MessageBox 包装器),我想在整个应用程序中使用它。据我了解,我应该通过我的所有 ViewModel 的构造函数注入这个服务,如下所示:
public MainWindowViewModel(IDialogService injectedDialogService) // Dialog service dependency injection
{
dialogService = injectedDialogService;
...
...
}
我在各自的 ViewModel 中将 dialogService 声明为:
private IDialogService dialogService;
然后我希望像这样在整个 ViewModel 中使用它:
dialogService.ShowDialog("Some message...");
或者,像这样:
if (dialogService.ShowDialog("Confirm delete?", "Confirmation", DialogButtons.YesNo) == DialogResult.Yes)
{
// Delete it...
}
但是,我从各自的视图中收到以下投诉:
“MainWindowViewModel”类型不包括任何可访问的构造函数。
当我编译解决方案时,来自视图的以下错误消息:
System.NullReferenceException: '对象引用未设置为对象的实例。'
这就是我将 View 与 ViewModel 关联起来的方式:
<Window.Resources>
<vm:MainWindowViewModel x:Key="MainWindowViewModel"/>
...
...
...
</Window.Resources>
还有数据上下文:
<Window.DataContext>
<vm:MainWindowViewModel/>
</Window.DataContext>
如果这有帮助,这里是我的对话服务:
namespace FIM.Framework.Services
{
public enum DialogButtons
{
OK = 0,
OKCancel = 1,
YesNoCancel = 3,
YesNo = 4,
}
public enum DialogResult
{
None = 0,
OK = 1,
Cancel = 2,
Yes = 6,
No = 7,
}
public enum DialogImage
{
None = 0,
Error = 16,
Hand = 16,
Stop = 16,
Question = 32,
Exclamation = 48,
Warning = 48,
Information = 64,
Asterisk = 64,
}
public interface IDialogService
{
DialogResult ShowDialog(string messageBoxText,
string caption = null,
DialogButtons buttons = DialogButtons.OK,
DialogImage icon = DialogImage.None,
DialogResult defaultResult = DialogResult.None);
}
public class DialogService : IDialogService
{
public DialogResult ShowDialog(string messageBoxText,
string caption = null,
DialogButtons buttons = DialogButtons.OK,
DialogImage image = DialogImage.None,
DialogResult defaultResult = DialogResult.None)
{
return (DialogResult)System.Windows.MessageBox.Show(messageBoxText,
caption,
(System.Windows.MessageBoxButton)buttons,
(System.Windows.MessageBoxImage)image,
(System.Windows.MessageBoxResult)defaultResult);
}
}
}
你能帮我解决这个问题吗?如果我的方法是错误的,或者不是最好的,有人可以建议一个更好的对话服务实现吗? 非常感谢。
【问题讨论】:
-
取决于框架,有些是约定俗成的。
-
我不使用任何 MVVM 框架,例如 Caliburn 或 MVVM light,如果这就是你的意思的话。我正在尝试自己实现 MVVM 框架。
标签: wpf mvvm modal-dialog