如何将Xamarin表单中的Slider绑定到Viewmodel属性?

时间:2018-07-26 14:36:41

标签: c# xaml xamarin xamarin.forms visual-studio-mac

我是Xamarin表格的新手,仅使用了几个月。我有一个Xamarin表单应用程序,它将与Android和iOS一起使用,并且正在使用MVVM结构。我在ViewModel中有一个ObservableCollection对象,我正在使用扩展了StackLayout的自定义中继器视图进行迭代,并且在DataTemplate内有一个自定义Entry类,该类扩展了Entry将其Text属性绑定到对象的Value属性(可为null的双精度)。

接下来我要做的是,如果要添加到模型中的某个布尔值为true,则修改模板以隐藏Entry标记,然后显示SliderLabel,以显示Slider的值。

到目前为止,我已经能够将Maximum / Minimum属性绑定到我的Viewmodel属性,这很棒,但是只要我尝试将Value属性绑定到{{ 1}},我的XAML无法加载,并且没有任何错误。我还需要实现功能,以仅允许用户在给定的“增量”(.1、1、2等)上滑动。我想滑动Slider,一旦用户停止滑动,就Slider属性被设置并存储在模型中。如果已经存在一个值,我还需要对其进行预加载,但是稍后可以找到这两个值。

我认为我对此做错了。我尝试搜索许多不同的示例,但是我无法解决这个问题。

这是我的XAML滑块/标签的外观

Value

我的模型的简化版本,因为我不想在那里放我可能不应该放的代码。

<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" />

1 个答案:

答案 0 :(得分:0)

从您输入的代码中(缺少一些关键部分), 但我认为您应该使用 max_input_vars 绑定:

TwoWay

您也不需要为属性使用<Slider x:Name="slider" Value="{Binding Value, Mode=TwoWay}" Maximum="{Binding VM.Question.NumericMaxValue}" /> (如@jason所述),因为滑块控件始终具有一个值。

为什么第二个绑定(Nullable<double>属性)等于'Maximum ...'? VM.Question绑定是否不同? 即:

Value

要仅在控件的拇指完成“移动”后才更新值,应使用反应性扩展。 它使您可以操纵事件并选择一个系列的“最后一个”:

Rx for Xamarin forms presentation

我让您查看并检查更多详细信息...