Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn ShowDialog和MessageBox_C#_Wpf_Mvvm_Messagebox_Caliburn.micro - Fatal编程技术网

C# Caliburn ShowDialog和MessageBox

C# Caliburn ShowDialog和MessageBox,c#,wpf,mvvm,messagebox,caliburn.micro,C#,Wpf,Mvvm,Messagebox,Caliburn.micro,我正在用caliburn为MVVM制作一个小的演示应用程序 现在我想显示一个消息框,但是要显示MVVM方式 对于对话框,我创建了一个事件,该事件在ShellView(根视图)中处理 只需使用对话框ViewModel类型调用WindowManager.ShowDialog。 对我来说,似乎坚持使用MVVM 但是,如何显示messagebox并获得其结果(确定或取消) 我已经看到了,但也没有答案 艾森伯格先生回答道 “Caliburn具有用于调用自定义消息框的内置服务。” 有人能说出他的意思吗?我在

我正在用caliburn为MVVM制作一个小的演示应用程序

现在我想显示一个
消息框
,但是要显示MVVM方式

对于对话框,我创建了一个事件,该事件在
ShellView
(根视图)中处理 只需使用对话框
ViewModel
类型调用
WindowManager.ShowDialog
。 对我来说,似乎坚持使用MVVM

但是,如何显示messagebox并获得其结果(确定或取消)

我已经看到了,但也没有答案

艾森伯格先生回答道

“Caliburn具有用于调用自定义消息框的内置服务。”


有人能说出他的意思吗?我在示例中没有看到它。

如您所述,您只需准备视图模型(例如,
确认框ViewModel
)和适当的视图。您必须创建两个操作(从
屏幕
继承视图模型后,这是使用
TryClose
所必需的。您可以始终实现
IScreen
,但这将是更多的工作):

然后在其他视图模型中:

var box = new ConfirmationBoxViewModel()
var result = WindowManager.ShowDialog(box);
if(result == true)
{
// OK was clicked
}
请注意,对话框关闭后,如果需要从对话框中提取其他数据(例如,所选项目、显示名称等),则可以访问视图模型属性。

在文章(由框架协调员撰写)中,作者展示了一种处理对话框和消息框的好方法,但他使用了依赖项注入(当然,您可以不使用DI,但这会使事情变得更简单)。主要思想是,您可以让主窗口(用作应用程序外壳的窗口)实现一个如下所示的界面:

public interface IDialogManager
    {

        void ShowDialog(IScreen dialogModel);
        void ShowMessageBox(string message, string title = null, MessageBoxOptions options = MessageBoxOptions.Ok, Action<IMessageBox> callback = null);

    }
公共接口IDialogManager
{
void ShowDialog(IScreen dialogModel);
void ShowMessageBox(字符串消息,字符串标题=null,MessageBoxOptions=MessageBoxOptions.Ok,操作回调=null);
}

然后他将这个接口注册到IoC容器中,我想从那以后你可以发挥你的想象力,如果你没有时间,那么你可以看看这篇文章附带的。当root/main/shell视图模型实现了一种DialogService接口时,每一个需要显示对话框的其他视图模型都会以对根视图模型的依赖关系。有时这可能不是必需的,例如,如果它可能导致依赖关系循环:
DialogService(又名RootViewModel)->SomeViewModel->RootViewModel

一种更为复杂的打破依赖链的方法(实际上是颠倒依赖链)如下所示:

  • 实现检测<代码>窗口的行为。OnSourceInitialized事件并将其附加到主视图<代码>窗口组件。这是当窗口句柄可用时激发的事件。事件发生时,行为将通过附加属性通知传入的某些处理程序:

公共类WindowsSourceBehavior:行为
{
// ...
//IwinDownListener InitListener依赖项属性的样板代码
// ...
attachedWindow.SourceInitialized+=(发送方,evt)=>
{
// ...
InitListener.SourceInitialized(发送方作为窗口);
}
}
  • DialogService根据行为的请求公开处理程序或接口:
公共类DialogService:IWindowListener
{
// ...
public void SourceInitialized(Window rootWindow){/*…*/}
}
  • 在根视图模型中,(间接地)将DialogService作为依赖项注入。在构造过程中,将视图模型绑定属性
    WindowListener
    设置为DialogService处理程序/接口:
public MainViewModel(IWindowListener对话框serviceUndisguise)
{
WindowListener=DialogServiceIn伪装;
}
公共iWindows Listener WindowListener{get;private set;}

这样,DialogService就能够获得根窗口,并且无论哪个视图模型需要显示对话框,都不会创建(n间接)对主视图模型的依赖性。

非常感谢!好的,这是一个看起来像messagebox的对话框。但是有没有一种简单的方法来封装messagebox?有没有一种解耦的方法来通过事件实现这一点?messagebox非常通用,我希望以某种方式使用它。我真的不这么认为,至少我没有真正简单的方法知道。考虑到您可以创建一个易于定制和使用的对话框,如视图模型和视图,我不认为有任何理由包装默认的
MessageBox
…非常感谢!我唯一的问题是返回用户在MessageBox(或对话框)中选择的内容。必须仔细看一看。好的,是Silverlight和MEF,所以这对我来说不是很简单。@MareInfinitus您可以通过
操作
回调来了解用户在
ShowMessageBox
方法中选择了什么。另一方面,如果您不知道Silverlight和MEF,我已经下载了示例并转换了它使用Ninject发送到WPF。如果您愿意,我可以上传到您的某个地方。@MareInfinitus您可以下载它。@IbrahimNajjar答案中提到的所有链接都已过期。您有更新的链接吗?我看不出接受的答案在哪里有(间接的)对主/shell视图模型的依赖性。伪装很多东西也不是最好的主意,我喜欢明确地说明依赖性和所做的事情。如果我做得对的话,在这种情况下,主视图模型实现了一个
IDialogManager
接口,我猜该接口将被注入到彼此的视图模型nee中需要显示对话框。因此许多视图模型最终都依赖于根视图模型。顺便说一句,在这种情况下,它不会是对根视图模型的显式依赖,因为它们不需要。同样,这将是对IDialogManager接口的伪装依赖,而不知道它实际上是根视图模型。我认为是这样的对了,顺便问一下。你觉得怎么样?不,DialogManager刚刚被注入,s
public interface IDialogManager
    {

        void ShowDialog(IScreen dialogModel);
        void ShowMessageBox(string message, string title = null, MessageBoxOptions options = MessageBoxOptions.Ok, Action<IMessageBox> callback = null);

    }