una forma más limpia (Asunto de gusto personal) que utilizo mucho es utilizar el patrón de iResult, de esta manera abstracta el implemenation Ventana
viewmodel
public IEnumerable<IResult> CloseMe()
{
yield return new CloseResult();
}
Código de resultado
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;
}
editar (Solo es necesario para IoC): Si quieres dar un paso más, haces una clase base para todas las pantallas
public abstract class ShellPresentationModel : Screen
{
public ShellPresentationModel(IResultFactory resultFactory)
{
Result = resultFactory;
}
public IResultFactory Result { get; private set; }
}
esta manera se puede inyectar dependencias con una COI mucho más fácil, entonces su modelo de vista estrecha método se verá así
public IEnumerable<IResult> CloseMe()
{
yield return Result.Close();
}
Un ejemplo de un iResult que utiliza la dependencia puede ser
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);
}
}
edit Acabo de darme cuenta de que olvidé agregar un ejemplo del exmaple IoC anterior, aquí va Con un IoC para niños que contiene patrón er que se vería así
public IEnumerable<IResult> ShowDialog()
{
yield return Result.ShowDialog<MyViewModel>();
}
Sin un patrón contenedor secundario que tendría que inyectar dependeync padres en el niño manualmente
yield return Result.ShowDialog<MyViewModel>().Configure(m => m.SomeData = this.SomeData);
TryClose intenta cerrar toda la aplicación ... – Tim
Bueno, cierra la aplicación completa solo si está intentando cerrar la ventana principal de la aplicación. –
que acaba de salvar mi día :-) – juFo