Mvvm 根据多个属性创建BindableProperty

Mvvm 根据多个属性创建BindableProperty,mvvm,xamarin,data-binding,properties,xamarin.forms,Mvvm,Xamarin,Data Binding,Properties,Xamarin.forms,我正在尝试将UI元素绑定到不同的模型属性a、B和AB。前两个属性A和B由两个滑块控制。第三个属性AB是A和B的总和。对于这三个特性中的每一个,都有一个显示其值的标签 现在,如果我移动其中一个滑块,相应的标签将更新其文本。但是组合属性AB的标签不会更新。可能不会触发“属性更改”事件,因为没有AB的setter 是否有可能绑定到此类“聚合”属性? 下面是包含属性A、B和AB的可绑定对象: 公共类设置:BindableObject { 公共静态只读BindableProperty AProperty=

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

现在,如果我移动其中一个滑块,相应的标签将更新其
文本
。但是组合属性
AB
的标签不会更新。可能不会触发“属性更改”事件,因为没有
AB
的setter

是否有可能绑定到此类“聚合”属性?

下面是包含属性
A
B
AB
的可绑定对象:

公共类设置:BindableObject
{
公共静态只读BindableProperty AProperty=BindableProperty.Create(p=>p.A,0);
公共静态只读BindableProperty BProperty=BindableProperty.Create(p=>p.B,0);
公共静态只读BindableProperty ABProperty=BindableProperty.Create(p=>p.AB,0);
公共双A{
获取{return(double)GetValue(approperty);}
set{SetValue(属性,(双)值);}
}
公共双B{
获取{return(double)GetValue(BProperty);}
set{SetValue(BProperty,(double)value);}
}
公共双AB{
获取{返回A+B;}
}
}
这是包含滑块和三个标签的页面:

公共类应用程序:应用程序
{
公共应用程序()
{
变量设置=新设置();
var sliderA=新滑块();
sliderA.ValueChanged+=(发送方,e)=>settings.A=e.NewValue;
var sliderB=新滑块();
sliderB.ValueChanged+=(发送方,e)=>settings.B=e.NewValue;
var labelA=新标签{BindingContext=settings};
labelA.SetBinding(Label.TextProperty,“A”);
var labelB=新标签{BindingContext=settings};
labelB.SetBinding(Label.TextProperty,“B”);
var labelAB=新标签{BindingContext=settings};
labelAB.SetBinding(Label.TextProperty,“AB”);
主页=新内容页{
内容=新的堆栈布局{
垂直选项=布局选项。中心,
Children={sliderA,sliderB,labelA,labelB,labelAB},
},
};
}
}
这是iOS上运行的应用程序的外观:

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


编辑:

我不知道为什么我不会写字

    public static readonly BindableProperty ABProperty =
        BindableProperty.Create<Settings, double>(p => p.A + p.B, 0);
公共静态只读BindableProperty ABProperty=
创建(p=>p.A+p.B,0);

但这会产生运行时错误“System.TypeInitializationException:AggregatedBindablePropertyMnml.Settings-->System.exception:getter必须是MemberExpression”根据Taekahn的建议(在a和B的setter中更新AB),类型初始值设定项引发异常我提出了以下解决方案

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

protected override void OnPropertyChanged(string propertyName = null)
{
    base.OnPropertyChanged(propertyName);
    SetValue(ABProperty, A + B);
}
现在,两个滑块都会影响第三个标签:


您是否尝试过使用自定义IMultiValueConverter进行多重绑定?@Will:我尝试过使用
IValueConverter
。(据我所知,Xamarin中没有
IMultiValueConverter
),但问题仍然存在:虽然最初调用了转换器,但标签没有更新。IMultiValueConverter和MultiBinding在WPF堆栈中,不确定Xamarin中包含什么。不管怎样,这就是通常的做法。您可能需要滚动您自己的解决方案:/只需快速浏览一下,如果您在apProperty和bpProperty设置器中都设置了ABProperty,您应该会得到更新。@Taekahn:哦,是的,就是这样!AB所依赖的每个属性A和B都需要在其setter中更新AB。因此,实现
UpdateAB()
方法并在两个setter中调用它非常方便。