Wit*_*her 19 wpf dialog window caliburn.micro
我ViewModel1和View1相关联.我ViewModel2使用IWindowManagerobject 从(另一个viewmodel)启动对话框窗口.ViewModel2类中的代码:
windowManager.ShowDialog(new ViewModel());
Run Code Online (Sandbox Code Playgroud)
所以,我有Viewop窗口和View1用户控件.
我的答案是下一个 - 我可以使用红色关闭按钮关闭该对话框窗口,但是如何使用我的特定按钮(包含在View1用户控件中)关闭它,类似"取消"按钮和关闭命令(Command={Binding CancelCommand}),CancelCommand当然包含在ViewModel1课堂上.
Mic*_*l T 41
如果您的视图模型扩展,它会更容易Caliburn.Micro.Screen:
TryClose();
Run Code Online (Sandbox Code Playgroud)
nem*_*esv 10
您可以通过在IViewAwareViewModel上实现接口来获取当前视图(在您的情况下是对话框窗口).然后,您可以Close在Window执行命令时调用视图(创建为对话框).
最简单的原因是ViewAware:
public class DialogViewModel : ViewAware
{
public void ExecuteCancelCommand()
{
(GetView() as Window).Close();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不被允许派生,您可以自己实施:
public class DialogViewModel : IViewAware
{
public void ExecuteCancelCommand()
{
dialogWindow.Close();
}
private Window dialogWindow;
public void AttachView(object view, object context = null)
{
dialogWindow = view as Window;
if (ViewAttached != null)
ViewAttached(this,
new ViewAttachedEventArgs(){Context = context, View = view});
}
public object GetView(object context = null)
{
return dialogWindow;
}
public event EventHandler<ViewAttachedEventArgs> ViewAttached;
}
Run Code Online (Sandbox Code Playgroud)
注意:我已经使用Caliburn.Micro 1.3.1作为我的样本.
我使用的一种更清洁的方式(个人品味的主题)是使用IResult模式,这样你抽象Window实现
视图模型
public IEnumerable<IResult> CloseMe()
{
yield return new CloseResult();
}
Run Code Online (Sandbox Code Playgroud)
结果代码
public class CloseResult : Result
{
public override void Execute(ActionExecutionContext context)
{
var window = Window.GetWindow(context.View);
window.Close();
base.Execute(context);
}
}
public abstract class Result : IResult
{
public virtual void Execute(ActionExecutionContext context)
{
OnCompleted(this, new ResultCompletionEventArgs());
}
protected virtual void OnCompleted(object sender, ResultCompletionEventArgs e)
{
if (Completed != null)
Completed(sender, e);
}
public event EventHandler<ResultCompletionEventArgs> Completed;
}
Run Code Online (Sandbox Code Playgroud)
编辑(仅适用于IoC):如果您想更进一步,请为所有屏幕执行基类
public abstract class ShellPresentationModel : Screen
{
public ShellPresentationModel(IResultFactory resultFactory)
{
Result = resultFactory;
}
public IResultFactory Result { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以更轻松地为IoC注入依赖关系,然后您的VIewmodel close方法将如下所示
public IEnumerable<IResult> CloseMe()
{
yield return Result.Close();
}
Run Code Online (Sandbox Code Playgroud)
关于使用依赖的IResult的示例可以是
public class ShowDialogResult<TModel> : Result
{
private readonly IWindowManager windowManager;
private readonly TModel model;
private Action<TModel> configure;
public ShowDialogResult(IWindowManager windowManager, TModel model)
{
this.windowManager = windowManager;
this.model = model;
}
public IResult Configure(Action<TModel> configure)
{
this.configure = configure;
return this;
}
public override void Execute(ActionExecutionContext context)
{
if(configure != null)
configure(model);
windowManager.ShowDialog(model);
base.Execute(context);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑只是注意到我忘了添加上面的IoC exmaple示例,这里有一个子IoC容器模式,它看起来像这样
public IEnumerable<IResult> ShowDialog()
{
yield return Result.ShowDialog<MyViewModel>();
}
Run Code Online (Sandbox Code Playgroud)
如果没有子容器模式,则需要手动将父依赖同步注入子进程
yield return Result.ShowDialog<MyViewModel>().Configure(m => m.SomeData = this.SomeData);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15231 次 |
| 最近记录: |