如何解决在常见情况下如何使用反应式
我开始在某些项目中使用ReactiveUI;我仍然有些难以理解的核心概念,而且我不知道如何管理一些常见情况以及最佳实践。
假设我创建了一个TextEditor,它公开了一个TextChanged事件。我设法创建一个可观察到的名为“ CanSave”的事件,该事件在用户写东西时发出true。 现在,我可以将“ CanSave”用作保存命令的“ canexecute”属性。这可行,但是,当用户单击“保存”时,“ CanSave”现在应该发出false,因为用户已经保存了他的工作!
应该如何处理这种情况?我想出了一个创建CanSave可设置属性并将其订阅更改的事件,然后观察CanSave属性..这是正确的方法吗?
解决方法
您快到了,或者您的术语和描述误导了我。
您需要某种可观察的IsDirty(或CanSave),可以将其用作canexecute。
进行了重大更改但未保存时,应该为真。
您要观察TextChanged并在引发它时将IsDirty设置为true。也许还检查了重大事件。
在用户保存时将其更改为false。
如果您以某种方式将IsDirty制作或包装为IoBservable,则可以将其作为工厂方法传递给ReactiveCommand.CreateFrom ....作为反应式命令。
var command = ReactiveCommand.CreateFromTask(LogOnAsync,IsDirty);
您可以通过在其他可观察值中加上说长来分隔内容。在这种情况下,您需要使用WhenAnyValue构建一个可以观察多个可观察对象的canexecute。
https://www.reactiveui.net/docs/handbook/commands/
一个常见的偏好是使用属性。然后,您可以将observable用作属性助手 文档告诉您以这种方式工作。
https://www.reactiveui.net/docs/handbook/observable-as-property-helper/
https://www.reactiveui.net/docs/guidelines/framework/prefer-oaph-over-properties
public class RepositoryViewModel : ReactiveObject
{
public RepositoryViewModel()
{
canDoIt = this.WhenAny(x => x.StuffFetched,y => y.OtherStuffNotBusy,(x,y) => x && y)
.ToProperty(this,x => x.CanDoIt);
}
readonly ObservableAsPropertyHelper<bool> canDoIt;
public bool CanDoIt
{
get { return canDoIt.Value; }
}
}
如果考虑一下,上面的CanDoIt与您可能想要的非常相似。
因为您还希望使用IsBusy之类的东西来保护您的命令,以使用户无法进行保存(或任何耗时的工作),然后立即尝试再次进行其他操作,例如在保存过程中再次进行保存。 / p>
我认为,reactiveui是非常聪明的东西。
但是。
就学习曲线和可以说是一种反直观的工作方式而言,您为此功能付出了很多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。