首先,这是无效的代码(惯于编译)
Value = Observable.Create<LibrarySettings>(() =>
{
new LibrarySettings(false, OperationOneEnable,OperationOneRate,
OperationTwoEnabled, OperationTwoRate);
});
Observable.Create通常采取Func<IObserver<T>, IDisposable>
作为参数,所以应校正为
Value = Observable.Create<LibrarySettings>(observer =>
{
observer.OnNext(new LibrarySettings(/*args*/));
//What to do here?
return Disposable.Empty; //Yuck.
});
可能更好,更简单的就是使用Observable.Return
,但是对此有什么可观察的。似乎它只是使用Rx来满足签名,因为这不符合Rx的精神。
相反,我想象你真正想要的是一个Settings
属性,它在通知发生变化时将其推送。为此,我认为有两个合理的方法
- 你的
LibrarySettings
一个只读属性,其中的类型LibrarySettings
是可变的,可观察到的。
- 您有一个易变和可观察的属性
LibrarySettings
,但类型LibrarySettings
是免费的。
即无论是只读属性
this.Setting.WhenAnyPropertyChanged()....
this.Setting.OperationOneRate = 25;
this.Setting.IsOperationOneEnabled= true;
其中类型是可变的
public class LibrarySettings : INotifyPropertyChanged
{
public LibrarySettings()
{
IsOperationOneEnabled = false;;
OperationOneRate = 0;
IsOperationTwoEnabled = false;
OperationTwoRate = 0;
}
public bool IsOperationOneEnabled { get;set; }
public double OperationOneRate { get; set; }
public bool IsOperationTwoEnabled { get;set; }
public double OperationTwoRate { get; set;}
#region INPC Impl
#region
}
还是一成不变的类型,你变异属性(每次用一个新的实例)。您显然希望使用默认值创建它。
this.WhenValueChanges(t=>t.Setting)....
this.Setting = new LibrarySettings(OperationOneEnable, OperationOneRate,
OperationTwoEnabled, OperationTwoRate);
而且类型像...
public class LibrarySettings
{
public LibrarySettings(bool isOperationOneEnabled, double operationOneRate,
bool isOperationTwoEnabled, double operationTwoRate)
{
IsOperationOneEnabled = isOperationOneEnabled;
OperationOneRate = operationOneRate;
IsOperationTwoEnabled = isOperationTwoEnabled;
OperationTwoRate = operationTwoRate;
}
public bool IsOperationOneEnabled { get; }
public double OperationOneRate { get; }
public bool IsOperationTwoEnabled { get; }
public double OperationTwoRate { get;}
}
我刚刚发现,你链接到(你链接到回购的根没有问题的实际类) * https://github.com/markiemarkus/Amadeus/blob/master/Amadeus/NovoApp/Models/LibrarySettings.cs
代码
主要的问题是在这里
Value = Observable.Create<LibrarySettings>(observer =>
{
observer.OnNext(new LibrarySettings(false, OperationOneEnabled, OperationOneRate, OperationTwoEnabled, OperationTwoRate));
return Disposable.Empty;
});
这些线路}
public IObservable<LibrarySettings> Value
{
get { return _Value; }
set { _Value = value; }
}
public void Write(LibrarySettings item)
{
Value = Observable.Create<LibrarySettings>(observer =>
{
observer.OnNext(new LibrarySettings(false, OperationOneEnabled,
OperationOneRate, OperationTwoEnabled, OperationTwoRate));
return Disposable.Empty;
});
}
您创建一个具有单一值的可观察序列(这样是不是真的观察到)。然后通过一个公共setter将它暴露出来(可设置的IObservable属性是什么意思?!)。最后,您在写入方法中写入该实例,意味着实际订阅了该属性原始值的任何人都将持有对孤立Observable序列的订阅。
你为什么认为setting.Value将变为null? –
@BuhBuh 当LibrarySettings类第一次启动时,它为null。即'新的LibrarySettings(true,20,true,30)'这些已启用并设置了费率属性,但值不是 – Mdev
您是否使用ReactiveUI? – Shlomo