根据多个属性创建BindableProperty

时间:2015-03-11 15:02:11

标签: mvvm xamarin data-binding properties xamarin.forms

我尝试将UI元素绑定到不同的模型属性ABAB。前两个属性AB由两个滑块控制。第三个属性ABAB的总和。对于三个属性中的每一个,都有一个标签显示其值。

现在,如果我移动其中一个滑块,相应的标签会更新其Text。但组合属性AB的标签未更新。可能没有"属性发生变化"事件被触发,因为AB没有设置器。

是否有可能绑定到这样的"聚合"属性吗

以下是包含属性ABAB的可绑定对象:

public class Settings: BindableObject
{
    public static readonly BindableProperty AProperty = BindableProperty.Create<Settings, double>(p => p.A, 0);
    public static readonly BindableProperty BProperty = BindableProperty.Create<Settings, double>(p => p.B, 0);
    public static readonly BindableProperty ABProperty = BindableProperty.Create<Settings, double>(p => p.AB, 0);

    public double A {
        get{ return (double)GetValue(AProperty); }
        set{ SetValue(AProperty, (double)value); }
    }

    public double B {
        get{ return (double)GetValue(BProperty); }
        set{ SetValue(BProperty, (double)value); }
    }

    public double AB {
        get{ return A + B; }
    }
}

这是包含滑块和三个标签的页面:

public class App : Application
{
    public App()
    {
        var settings = new Settings();

        var sliderA = new Slider();
        sliderA.ValueChanged += (sender, e) => settings.A = e.NewValue;

        var sliderB = new Slider();
        sliderB.ValueChanged += (sender, e) => settings.B = e.NewValue;

        var labelA = new Label{ BindingContext = settings };
        labelA.SetBinding(Label.TextProperty, "A");

        var labelB = new Label{ BindingContext = settings };
        labelB.SetBinding(Label.TextProperty, "B");

        var labelAB = new Label{ BindingContext = settings };
        labelAB.SetBinding(Label.TextProperty, "AB");

        MainPage = new ContentPage {
            Content = new StackLayout {
                VerticalOptions = LayoutOptions.Center,
                Children = { sliderA, sliderB, labelA, labelB, labelAB },
            },
        };
    }
}

这就是正在运行的应用程序在iOS上的样子:

最后一个标签应显示前两个数字的总和。


修改

我想知道为什么我不能写

    public static readonly BindableProperty ABProperty =
        BindableProperty.Create<Settings, double>(p => p.A + p.B, 0);

但这会产生运行时错误&#34; System.TypeInitializationException:AggregatedBindablePropertyMnml.Settings的类型初始化程序抛出异常---&gt; System.Exception:getter必须是MemberExpression&#34;

1 个答案:

答案 0 :(得分:0)

根据Taekahn的建议(在A和B的制定者中更新AB),我提出了以下解决方案。

通过覆盖OnPropertyChanged方法并设置ABProperty,绑定的标签文本也会更新。与单独修改每个setter相反,这种方式我们只需要在一个地方修改Settings类。

protected override void OnPropertyChanged(string propertyName = null)
{
    base.OnPropertyChanged(propertyName);
    SetValue(ABProperty, A + B);
}

现在两个滑块都会影响第三个标签: