Я использую Avalondock 2.x для одного из моих проектов с открытым исходным кодом, если документ загрязнен, когда вы его закрываете, вы сможете отменить закрытие.MVVM способ закрыть документ с возможностью отмены
Я использую Caliburn Micro и сопрограммный, только так, как я был в состоянии решить это использовать C.M прикрепить к событию
<i:EventTrigger EventName="DocumentClosing">
<cal:ActionMessage MethodName="DocumentClosing">
<cal:Parameter Value="$documentcontext" />
<cal:Parameter Value="$eventArgs" />
</cal:ActionMessage>
</i:EventTrigger>
агд события имеет свойство отмены. Проблема с этим approuch является то будет его не очень MVVM дружелюбный, я создал небольшой вспомогательный метод для Coroutinify это как
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
Я пытался найти информацию, как использовать Caliburn Micro сопрограммная вместе с командой Свойства, но нету найти хороший способ – Anders
@Anders Что делать, если ваша команда находится в DocumentManagerVM. Следующая работа не работает. Я начинаю работу с документа LayoutItemContainerStyle. {Binding DataContext.RequestCloseCommand, RelativeSource = {RelativeSource, Mode = FindAncestor, AncestorType = {x: Тип объявления: DockingManager}}} – M312V