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

我是 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);


           }

       }

   }

}


叮当猫咪
浏览 269回答 1
1回答

月关宝盒

从您放置的代码(有一些缺少的关键部分),但我认为您应该使用TwoWay绑定:<Slider x:Name="slider"&nbsp;&nbsp; &nbsp; Value="{Binding Value, Mode=TwoWay}"&nbsp; &nbsp; Maximum="{Binding VM.Question.NumericMaxValue}"&nbsp; &nbsp; />您也不需要Nullable<double>为您的属性使用 a (正如@jason 提到的那样),因为滑块控件始终具有一个值。为什么你的第二个绑定(Maximum属性)等于 ' VM.Question...' ?Value绑定不一样吗?IE:Value="{Binding VM.Value, Mode=TwoWay}" -- ??要仅在控件的拇指完成“移动”时更新值,您应该使用反应式扩展。它允许您操纵事件并选择系列中的“最后一个”,例如:Xamarin 演示文稿的 Rx我让你看到并检查更多细节......
打开App,查看更多内容
随时随地看视频慕课网APP