为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Xamarin 表单中将 Slider 数据绑定到 Viewmodel 属性?

如何在 Xamarin 表单中将 Slider 数据绑定到 Viewmodel 属性?

C#
叮当猫咪 2021-10-31 20:52:48
我是 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


我让你看到并检查更多细节......


查看完整回答
反对 回复 2021-10-31
  • 1 回答
  • 0 关注
  • 268 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信