我是 Xamarin 表单的新手,并且只使用了几个月。我有一个 Xamarin 表单应用程序,它将与 Android 和 iOS 一起使用,并且使用的是 MVVM 结构。我的ObservableCollectionViewModel 中有一个对象,我正在使用扩展的自定义转发器视图进行迭代,StackLayout并且在DataTemplate我有一个自定义 Entry 类的内部,该类扩展了 Entry,该类将其Text属性绑定到对象的Value属性(可为空的双精度值)。我接下来要做的是,Entry如果我添加到模型中的某个布尔值的值为 true ,则修改模板以隐藏标记,然后显示 aSlider和 aLabel以显示Slider.到目前为止,我已经能够将Maximum/Minimum属性绑定到我的 Viewmodel 中的属性,这很棒,但是每当我尝试将Value属性绑定到 时Slider,我的 XAML 都不会加载,并且我没有收到任何错误。我还需要实现仅允许用户在给定的“增量”(.1、1、2 等)上滑动的功能。我想滑动Slider,一旦用户停止滑动,该Value属性就会设置并存储在模型中。如果已经存在一个值,我还需要它来预加载,但我可以稍后再使用这两个值。我想我的做法是错误的。我试过搜索许多不同的例子,但我终生无法弄清楚这一点。这是滑块/标签的 XAML 外观<Slider x:Name="slider" Value="{Binding Value}" Maximum="{Binding VM.Question.NumericMaxValue}"/> <Label x:Name="displayLabel" Text="{Binding Source={x:Reference slider}, Path=Value, StringFormat='The slider value is {0:F0}'}" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />我的模型的简化版本,因为我不想将代码放在那里,我可能不应该这样做。public class MyItemModel{ private double? _value; public double? Value { get { return _value; } set { if (_value != value) { _value = value; if (!FormatAsTime) { if (VM.Question.NumericMaxValue != -1 && Value > VM.Question.NumericMaxValue) { Value = VM.Question.NumericMaxValue; return; } if (Value < VM.Question.NumericMinValue) { Value = VM.Question.NumericMinValue; return; } RaisePropertyChanged(() => Value); RaisePropertyChanged(() => HasValue); } } }}
1 回答
月关宝盒
TA贡献1772条经验 获得超5个赞
从您放置的代码(有一些缺少的关键部分),但我认为您应该使用TwoWay绑定:
<Slider x:Name="slider"
Value="{Binding Value, Mode=TwoWay}"
Maximum="{Binding VM.Question.NumericMaxValue}"
/>
您也不需要Nullable<double>为您的属性使用 a (正如@jason 提到的那样),因为滑块控件始终具有一个值。
为什么你的第二个绑定(Maximum属性)等于 ' VM.Question...' ?Value绑定不一样吗?IE:
Value="{Binding VM.Value, Mode=TwoWay}" -- ??
要仅在控件的拇指完成“移动”时更新值,您应该使用反应式扩展。它允许您操纵事件并选择系列中的“最后一个”,例如:
Xamarin 演示文稿的 Rx
我让你看到并检查更多细节......
- 1 回答
- 0 关注
- 268 浏览
添加回答
举报
0/150
提交
取消