5

我找不到以下问题的解决方案:

我使用 caliburn micro 的 WindowManager 打开一个对话框:

public void UserNew()
{
   this._windowManager.ShowDialog(new UserViewModel(this._windowManager));
}

现在,当用户使用 OK 按钮关闭对话框时,我需要一个 DialogResult。WindowManager 的 ShowDialog 方法不返回 DialogResult...

谁能帮我?

4

3 回答 3

10

在继承自Screen的对话框视图模型中的 caliburn micro 中,您可以执行以下操作:

TryClose(true); // for OK

或者

TryClose(false); // for Cancel

那么你可以这样做:

var vm = IoC.Get<MyViewModel>();
var r = WindowManager.ShowDialog(vm, null, null);

if (r.HasValue && r.Value) {
  // do something on OK
}

您的对话框 xaml 可能如下所示:

<Button Content="OK" cal:Message.Attach="[Event Click] = [AcceptButton()]" />
<Button Content="Cancel" cal:Message.Attach="[Event Click] = [CancelButton()]" />

使用这个命名空间:

xmlns:cal="http://www.caliburnproject.org"

这是对话框视图模型实现的详细代码示例:

public bool CanAcceptButton
{
  get { return true; /* add logic here */ }
}

public void AcceptButton()
{
  TryClose(true);
}

public bool CanCancelButton
{
  get { return true; }
}

public void CancelButton()
{
  TryClose(false);
}
于 2013-10-10T10:26:51.483 回答
9

我倾向于使用视图模型来确定对话框中发生了什么。例如,您可以拥有一个IsCancelled属性UserViewModel,您可以在通话返回后对其进行询问ShowDialog。就像是:

public void UserNew() {
    var userViewModel = new UserViewModel(this._windowManager);
    this._windowManager.ShowDialog(userViewModel);
    if (userViewModel.IsCancelled) {
        // Handle cancellation
    } else {
        // Handle other case(s)
    }
}
于 2012-05-15T16:07:18.520 回答
0

WPF 对话框返回可为空的布尔值,而不是 DialogResults。Caliburn 的 ShowDialog 也返回bool?

来自MSDN

对话框通常允许用户接受或取消在对话框关闭之前显示的任务。ShowDialog 返回一个 Nullable 布尔值,该值指定活动是被接受还是被取消。返回值是窗口关闭前 DialogResult 属性的值。有关详细信息,请参阅 DialogResult。

DialogResult以上是指bool名为 DialogResult on 的属性System.Windows.Window

如果您想返回更复杂的内容,只需在窗口上定义自己的枚举属性,并在对话框关闭后读取其值。

于 2012-05-15T09:27:06.550 回答