我的Xamarin Forms应用中的页面中有两个条目。这两个条目的Text
属性与realm
对象绑定。这是双向绑定,所以每当我在这些字段中的任何一个中输入值时,我的领域对象都会更新,反之亦然。这很好用。
但我的要求是,当用户更改一个条目中的值时,另一个条目中的值也需要重新计算和更新。它有两个单位转换条目(例如毫米英寸) - 当您更改mm值时,它会更新另一个字段中的英寸值,反之亦然。我怎样才能实现这种行为?
<Label Text="Speed" />
<Entry x:Name="SpeedEntry" Text="{Binding Speed, Mode=TwoWay}" />
<Label Text="Depth" />
<Entry x:Name="DepthEntry" Text="{Binding Depth, Mode=TwoWay}" />
答案 0 :(得分:0)
听起来你正在遵循MVVM模式(因为你不应该这样做,因为你正在做的是如何以及为什么使用它的一个主要例子)
我建议将计算放在ViewModel
中,因为它增加了代码重用的机会(跨平台和跨项目可能)
执行此操作的一种方法是以下代码段 - 还有很多其他代码 - 包括Fody.PropertyChanged
(减少所需的管道代码量),Reactive.UI
(用于响应式编程 - 也减少了管道)和类似的图书馆。
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class ConversionViewModel : INotifyPropertyChanged
{
private double depth;
private double speed;
public double Speed {
get { return this.speed; }
set {
this.speed = value;
this.OnPropertyChanged();
this.Depth = this.CalculateDepth();
}
}
public double Depth {
get { return this.depth; }
set {
this.depth = value;
this.OnPropertyChanged();
this.Speed = this.CalculateSpeed();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private double CalculateSpeed()
{
// do your calculation
return 0;
}
private double CalculateDepth()
{
// do your calculation
return 0;
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
您可以将计算移动到属性getter,只在实际需要时执行它。如果是相对CPU密集型计算,您可能希望将结果缓存在字段中,并在某些属性发生更改时使其无效。