从绑定中触发其他属性

时间:2017-06-09 05:08:31

标签: c# xamarin xamarin.forms

我的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}" />

1 个答案:

答案 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密集型计算,您可能希望将结果缓存在字段中,并在某些属性发生更改时使其无效。