我将 Avalondock 2.x 用于我的一个开源项目,如果关闭时文档脏了,应该可以取消关闭。
我正在使用 Caliburn Micro 和 Coroutine,我能够解决它的唯一方法是使用 CM 附加到事件
<i:EventTrigger EventName="DocumentClosing">
<cal:ActionMessage MethodName="DocumentClosing">
<cal:Parameter Value="$documentcontext" />
<cal:Parameter Value="$eventArgs" />
</cal:ActionMessage>
</i:EventTrigger>
事件 arg 具有取消属性。这个方法的问题是它对 MVVM 不是很友好,我创建了一个小助手方法来 Cooutinify 这个像
public IEnumerable<IResult> Coroutinify(IEnumerable<IResult> results, System.Action cancelCallback)
{
return results.Select(r =>
{
if (r is CancelResult)
cancelCallback();
return r;
});
}
像这样使用
public IEnumerable<IResult> DocumentClosing(ScriptEditorViewModel document, DocumentClosingEventArgs e)
{
return Result.Coroutinify(HandleScriptClosing(document), () => e.Cancel = true);
}
这可行,但有点笨拙等,是否有更多的 MVVM 方法可以在 Avalondock 中关闭具有取消功能的文档?
编辑:源代码
https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Shells/MainShellView.xaml#L29
https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Shells/MainShellViewModel.cs#L110
https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Result/ResultFactory.cs#L49