C# Reactiveui绑定不适用于SeekBar。进度
我正在尝试学习reactiveui,所以我想为android制作一个简单的提示计算器应用程序。 ViewModel是:C# Reactiveui绑定不适用于SeekBar。进度,c#,android,mvvm,xamarin.android,reactiveui,C#,Android,Mvvm,Xamarin.android,Reactiveui,我正在尝试学习reactiveui,所以我想为android制作一个简单的提示计算器应用程序。 ViewModel是: public class TipCalcViewModel : ReactiveObject { [IgnoreDataMember] private double _subtotal; [DataMember] public double Subtotal { get { return _subtotal; }
public class TipCalcViewModel : ReactiveObject
{
[IgnoreDataMember] private double _subtotal;
[DataMember]
public double Subtotal
{
get { return _subtotal; }
set { this.RaiseAndSetIfChanged(ref _subtotal, value); }
}
[IgnoreDataMember] private int _percentage;
[DataMember]
public int Percentage
{
get { return _percentage; }
set { this.RaiseAndSetIfChanged(ref _percentage, value); }
}
[IgnoreDataMember] private readonly ObservableAsPropertyHelper<double> _tipAmount;
[DataMember]
public double TipAmount
{
get { return _tipAmount.Value; }
}
[IgnoreDataMember] private readonly ObservableAsPropertyHelper<double> _total;
[DataMember]
public double Total
{
get { return _total.Value; }
}
public TipCalcViewModel(ITipCalcService service)
{
_tipAmount = this.WhenAnyValue(
x => x.Subtotal,
y => y.Percentage,
service.CalculateTipAmount)
.ToProperty(this, vm => vm.TipAmount);
_total = this.WhenAnyValue(
x => x.Subtotal,
y => y.Percentage,
service.CalculateTotal)
.ToProperty(this, vm => vm.Total);
}
}
活动如下所示:
public class TipCalcActivity : ReactiveActivity<TipCalcViewModel>
{
public EditText SubTotal { get { return this.GetControl<EditText>(); } }
public SeekBar Percentage { get { return this.GetControl<SeekBar>(); } }
public TextView PercentageText { get { return this.GetControl<TextView>(); } }
public TextView TipAmount { get { return this.GetControl<TextView>(); } }
public TextView Total { get { return this.GetControl<TextView>(); } }
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
var service = new TipCalcService();
ViewModel = new TipCalcViewModel(service);
this.Bind(ViewModel, vm => vm.Subtotal, v => v.SubTotal.Text);
//this.Bind(ViewModel, vm => vm.Percentage, v => v.Percentage.Progress);
this.OneWayBind(ViewModel, vm => vm.Percentage, v => v.PercentageText.Text);
this.OneWayBind(ViewModel, vm => vm.TipAmount, v => v.TipAmount.Text);
this.OneWayBind(ViewModel, vm => vm.Total, v => v.Total.Text);
var disposable = Observable.FromEventPattern<SeekBar.ProgressChangedEventArgs>(
h => Percentage.ProgressChanged += h,
h => Percentage.ProgressChanged -= h)
.Throttle(TimeSpan.FromMilliseconds(500))
.DistinctUntilChanged()
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(x =>
ViewModel.Percentage = x.EventArgs.Progress);
}
}
因此,问题是:
如果我使用上面的注释绑定,什么都不会发生。所以进度属性正在正确更改,但从未设置ViewModel的百分比属性。从viewmodel到视图的绑定工作正常,但EditText绑定在两个方向上都工作正常。如何解决这个问题
如果我从ProgressChanged事件创建可观察的,我设法使它工作。但即使我不得不这样做,我也不确定这是不是正确的方法。另外,在手动或非手动销毁活动时,我是否必须处理订阅
最后一件事。如果我想学习这个框架,最好的开始方式是什么
SeekBar很可能不在支持的开箱即用控件列表中;Android没有内置的方式来观察视图属性,所以我们必须一次性硬编码它们。如果您编写以下内容,则可以实现此功能:
var progressChanged = Observable.FromEventPattern<SeekBar.ProgressChangedEventArgs>(
h => Percentage.ProgressChanged += h,
h => Percentage.ProgressChanged -= h);
this.Bind(ViewModel,
vm => vm.Percentage,
v => v.Percentage.Progress,
signalViewUpdate: progressChanged);
SeekBar很可能不在支持的开箱即用控件列表中;Android没有内置的方式来观察视图属性,所以我们必须一次性硬编码它们。如果您编写以下内容,则可以实现此功能:
var progressChanged = Observable.FromEventPattern<SeekBar.ProgressChangedEventArgs>(
h => Percentage.ProgressChanged += h,
h => Percentage.ProgressChanged -= h);
this.Bind(ViewModel,
vm => vm.Percentage,
v => v.Percentage.Progress,
signalViewUpdate: progressChanged);