Caliburn Micro:DialogResult

时间:2012-05-15 09:11:11

标签: c# wpf caliburn.micro dialogresult

我无法找到解决以下问题的方法:

我使用来自caliburn micro的WindowManager打开一个Dialog:

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

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

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:7)

我倾向于使用视图模型来处理确定对话框中发生的事情。例如,您可以在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)
    }
}

答案 1 :(得分:7)

在您继续使用屏幕的dialogviewmodel中的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"

这是对话框viewmodel实现的详细代码示例:

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);
}

答案 2 :(得分:0)

WPF对话框返回可空的bool而不是DialogResults。 Caliburn的ShowDialog也会返回bool?

来自MSDN

  

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

上面的

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

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

答案 3 :(得分:0)

您可以使用视图中的按钮单击事件来设置DialogResult。这将由Caliburn Micro的WindowManager.ShowDialog()方法返回。

在来电者代码隐藏中:

IWindowManager wm = AppContext.GetService<IWindowManager>();
var dialog = new DialogViewModel();
var result = wm.ShowDialog(dialog);
if (result.HasValue && result.Value)
{
    // Act on result
} 
// Ignore result

在对话框代码隐藏中:

private void Ok_OnClick(object sender, RoutedEventArgs e)
{
    DialogResult = true;
}

private void Cancel_OnClick(object sender, RoutedEventArgs e)
{
    DialogResult = false;
}

在对话框XAML文件中:

<Button x:Name="Ok"
     Content="Ok"
     Click="Ok_OnClick" />
<Button x:Name="Cancel"
     Content="Cancel"
     Click="Cancel_OnClick"/>

在ViewModel中:

public void Ok()
{

}

public void Cancel()
{

}

我已经确认已进行了Ok()Cancel()次调用,Ok_OnClick() Cancel_OnClick()事件被触发,以及来自{{1}的返回值是正确的。