我无法找到解决以下问题的方法:
我使用来自caliburn micro的WindowManager打开一个Dialog:
public void UserNew()
{
this._windowManager.ShowDialog(new UserViewModel(this._windowManager));
}
现在,当用户使用“确定”按钮关闭对话框时,我需要一个DialogResult。 WindowManager的ShowDialog方法不返回DialogResult ...
任何人都可以帮助我吗?
答案 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}的返回值是正确的。