gpt4 book ai didi

c# - MVVM 关闭文档的方式可以取消

转载 作者:太空狗 更新时间:2023-10-29 23:23:13 24 4
gpt4 key购买 nike

我正在为我的一个开源项目使用 Avalondock 2.x,如果关闭文档时文档变脏,您应该能够取消关闭。

我正在使用 Caliburn Micro 和协程,我能够解决它的唯一方法是使用 C.M 附加到事件

<i:EventTrigger EventName="DocumentClosing">
<cal:ActionMessage MethodName="DocumentClosing">
<cal:Parameter Value="$documentcontext" />
<cal:Parameter Value="$eventArgs" />
</cal:ActionMessage>
</i:EventTrigger>

事件参数有一个取消属性。这个方法的问题在于它对 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

最佳答案

我完成此操作的方法是绑定(bind)到 AvalonDock LayoutItem 的 CloseCommand 属性。当此绑定(bind)关联时,它会覆盖关闭文档的默认行为(“X”按钮,右键单击关闭/关闭所有)。如果需要,您将全权负责删除(关闭)文档。

我设置它的方式是拥有一个包含 DocumentVM 的 ObservableCollection 的 DocumentManagerVM。每个 DocumentVM 都有一个名为 RequestCloseCommand 的 ICommand,它可以通过将自身从它拥有的 DocumentManagerVM 的 DocumentVM 集合中移除来关闭文档。

具体来说,在我的 DocumentVM View 模型中,有一个 ICommand(我正在使用 mvvmLight RelayCommand)来执行关闭逻辑:

public RelayCommand RequestCloseCommand { get; private set; }
void RequestClose()
{
// if you want to prevent the document closing, just return from this function
// otherwise, close it by removing it from the collection of DocumentVMs
this.DocumentManagerVM.DocumentVMs.Remove(this);
}

在您的 View 中,在 LayoutItemContainerStyle 或 LayoutItemContainerStyleSelector 中设置绑定(bind)。

<ad:DockingManager
DataContext="{Binding DocumentManagerVM}"
DocumentsSource="{Binding DocumentVMs}">

<ad:DockingManager.LayoutItemContainerStyle>
<Style TargetType="{x:Type ad:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Header}"/>
<Setter Property="CloseCommand" Value="{Binding Model.RequestCloseCommand}"/>
</Style>
</ad:DockingManager.LayoutItemContainerStyle>

</ad:DockingManager>

关于c# - MVVM 关闭文档的方式可以取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com