我对Rx相当陌生,并尝试解决以下情况。
物品来自服务器,并带有一组供应商。这些供应商之一将被提名为主要供应商。为了使它们在WPF中可编辑/可绑定,我创建了一些代理反应式对象,这些对象将对UI中的更改进行“反应”并重新计算一些数字。
为了确保只有一个供应商可以成为主要供应商,我实现了以下代码-该代码使用一个主题来完成工作。
我已经读过主题可能是代码的味道,我想知道我所做的是“正确的方法”还是可以采用一种更清洁的方法。
public class VendorDto
{
public string Name { get; set; }
public bool IsPrimary { get; set; }
}
public class VendorProxy : ReactiveObject
{
// INPC for Name and other properties.
public bool IsPrimary => _isPrimary.Value;
private readonly ObservableAsPropertyHelper<bool> _isPrimary;
public ReactiveCommand<Unit, Unit> MakePrimary { get; }
public VendorProxy(VendorDto dto, IObservable<VendorProxy> primaryVendors, Action<VendorProxy> makePrimary)
{
primaryVendors
.DistinctUntilChanged()
.Select(x => x == this)
.ToProperty(this, x => x.IsPrimary, out _isPrimary);
MakePrimary = ReactiveCommand.Create(() => makePrimary(this),
canExecute: this.WhenAnyValue(x => x.IsPrimary, alreadyPrimary => !alreadyPrimary));
if (dto.IsPrimary)
makePrimary(this); // set the initial value of IsPrimary.
}
// implements IEquality.
}
public class ItemProxy : ReactiveObject
{
private ISubject<VendorProxy> PrimaryVendorSubject { get; } = new BehaviorSubject<VendorProxy>(null);
public IObservable<VendorProxy> PrimaryVendorChanged => PrimaryVendorSubject;
public ReactiveList<VendorProxy> Vendors { get; }
public VendorProxy PrimaryVendor => _primaryVendor.Value;
private readonly ObservableAsPropertyHelper<VendorProxy> _primaryVendor;
相关分类