Một cách sạch hơn (Chủ đề của sở thích cá nhân) mà tôi sử dụng rất nhiều là sử dụng mô hình IResult, bằng cách này bạn trừu tượng Window implemenation
ViewModel
public IEnumerable<IResult> CloseMe()
{
yield return new CloseResult();
}
mã kết quả
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;
}
chỉnh sửa (Chỉ cần thiết cho IoC): Nếu bạn muốn tiến thêm một bước nữa, bạn thực hiện một lớp cơ sở cho tất cả các màn hình
public abstract class ShellPresentationModel : Screen
{
public ShellPresentationModel(IResultFactory resultFactory)
{
Result = resultFactory;
}
public IResultFactory Result { get; private set; }
}
Bằng cách này bạn có thể tiêm phụ thuộc với một IoC dễ dàng hơn nhiều, sau đó ViewModel của bạn phương pháp chặt chẽ sẽ trông như thế này
public IEnumerable<IResult> CloseMe()
{
yield return Result.Close();
}
Một ví dụ về một IResult có sử dụng phụ thuộc có thể
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);
}
}
chỉnh sửa Chỉ cần lưu ý rằng tôi quên thêm một ví dụ về sơ đồ IoC ở trên, ở đây đi Với một IoC con chứa er mẫu nó sẽ trông như thế này
public IEnumerable<IResult> ShowDialog()
{
yield return Result.ShowDialog<MyViewModel>();
}
Nếu không có một mẫu chứa con bạn sẽ cần phải tiêm dependeync mẹ vào đứa trẻ bằng tay
yield return Result.ShowDialog<MyViewModel>().Configure(m => m.SomeData = this.SomeData);
TryClose cố gắng để đóng toàn bộ ứng dụng ... – Tim
Vâng, nó đóng toàn bộ ứng dụng chỉ khi bạn đang cố gắng đóng cửa sổ ứng dụng chính. –
bạn vừa lưu ngày của tôi :-) – juFo