【发布时间】:2015-05-13 10:48:37
【问题描述】:
我正在尝试将 UI 元素绑定到不同的模型属性 A、B 和 AB。前两个属性A 和B 由两个滑块控制。第三个属性AB 是A 和B 的总和。对于这三个属性中的每一个,都有一个显示其值的标签。
现在,如果我移动其中一个滑块,相应的标签会更新其Text。但组合属性AB 的标签未更新。由于AB 没有设置器,因此可能不会触发“属性更改”事件。
是否有可能绑定到这样的“聚合”属性?
这是包含属性A、B和AB的可绑定对象:
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);
但这会产生运行时错误“System.TypeInitializationException:AggregatedBindablePropertyMnml.Settings 的类型初始化程序引发了异常 ---> System.Exception:getter 必须是 MemberExpression”
【问题讨论】:
-
您是否尝试过使用自定义 IMultiValueConverter 进行多重绑定?
-
@Will:我尝试使用
IValueConverter。 (据我所知,Xamarin 中没有IMultiValueConverter。)但问题仍然存在:虽然最初调用了转换器,但标签并未更新。 -
IMultiValueConverter 和 MultiBinding 在 WPF 堆栈中,不确定 xamarin 中包含什么。无论如何,这就是通常的做法。您可能只需要推出自己的解决方案:/
-
快速浏览一下,如果您在 AProperty 和 BProperty 设置器中都设置了 ABProperty,您应该会得到更新。
-
@Taekahn:哦,是的,就是这样! AB 所依赖的每个属性 A 和 B 都需要在其 setter 中更新 AB。所以实现
UpdateAB()方法并在两个setter 中调用它非常方便。
标签: mvvm xamarin data-binding properties xamarin.forms