一個更清潔的方式(看個人口味主題),我用了很多是使用IResult模式,這樣你抽象窗口實行
視圖模型
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注入依賴更加容易,那麼你的視圖模型close方法看起來像這樣
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>();
}
沒有一個子容器模式ER模式,你將需要注入母公司dependeync到孩子手動
yield return Result.ShowDialog<MyViewModel>().Configure(m => m.SomeData = this.SomeData);
TryClose嘗試關閉整個應用程序... – Tim 2012-07-25 13:56:52
只有當您嘗試關閉主應用程序窗口時,纔會關閉整個應用程序。 – 2012-10-04 20:51:34
你剛剛救了我的日子:-) – juFo 2013-05-23 15:21:49