我经常使用的更简洁的方法是使用IResult模式,这样可以抽象出Window实现。 Viewmodel
public IEnumerable<IResult> CloseMe()
{
yield return new CloseResult();
}
结果代码
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;
}
编辑(仅适用于IoC):如果您想进一步发展,可以为所有屏幕创建一个基类。
public abstract class ShellPresentationModel : Screen
{
public ShellPresentationModel(IResultFactory resultFactory)
{
Result = resultFactory;
}
public IResultFactory Result { get; private set; }
}
通过IoC,您可以更轻松地注入依赖项,然后您的VIewmodel关闭方法将如下所示
public IEnumerable<IResult> CloseMe()
{
yield return Result.Close();
}
一个使用依赖项的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);
}
}
编辑 刚刚注意到我忘了添加上面IoC示例的一个例子,这里是例子。使用子IoC容器模式,它会像这样。
public IEnumerable<IResult> ShowDialog()
{
yield return Result.ShowDialog<MyViewModel>();
}
没有子容器模式,您需要手动将父依赖项注入到子容器中。
yield return Result.ShowDialog<MyViewModel>().Configure(m => m.SomeData = this.SomeData)