gpt4 book ai didi

c# - 执行后处理 ReactiveCommand

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:49 25 4
gpt4 key购买 nike

我正在使用 System.Windows.Interactivity 绑定(bind)一个 LoadedCommand,如下所示:

<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>

在我的 View 模型中,我在加载 View 时加载数据:

LoadedCommand = ReactiveCommand.CreateFromTask(LoadData);

我的问题是 Loaded 事件实际上被父 View 触发了多次。我想在第一次执行后停止 LoadedCommand 而不做类似的事情:

async Task LoadData()
{
if (didLoad) return;
...
}

最佳答案

这是一个棘手的问题,因为 Load 处理程序被调用了多次。它很烦人。所以我们有一些帮助代码来解决这个问题。

using System;
using System.Collections.Generic;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Windows;

namespace Utils
{
public static class FrameworkElementExtensions
{
public static void LoadUnloadHandler
( this FrameworkElement control
, Func<IDisposable> action)
{
var state = false;
var cleanup = new SerialDisposable();
Observable.Merge
(Observable.Return(control.IsLoaded)
, control.Events().Loaded.Select(x => true)
, control.Events().Unloaded.Select(x => false)
)
.Subscribe(isLoadEvent =>
{
if (!state)
{
// unloaded state
if (isLoadEvent)
{
state = true;
cleanup.Disposable =
new CompositeDisposable(action());
}
}
else
{
// loaded state
if (!isLoadEvent)
{
state = false;
cleanup.Disposable = Disposable.Empty;
}
}

});
}


}
}

代码处理LoadUnload 事件并过滤掉多次调用问题。这个想法是您提供一个回调,它在 Load 上执行某些操作并返回将在 Unload 上处理的 IDisposable

例如,如果您需要注册到网络连接等外部资源,但只有当控件可见时,您才可以在构造函数后面的代码中执行。

this.LoadUnloadHandler(()=>{
MyViewModel.Connect();
return Disposable.Create(()=>MyViewModel.Disconnect());
});

使用的类/库

关于c# - 执行后处理 ReactiveCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922914/

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