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



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

我接下来要做的是,如果我添加到模型中的某个布尔值为true,则修改模板以隐藏Entry标记,然后显示SliderLabel,以显示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);
SpinDownCommand.RaiseCanExecuteChanged();
SpinUpCommand.RaiseCanExecuteChanged();
}
else
{
RaisePropertyChanged(() => Value);
RaisePropertyChanged(() => HasValue);
}
VM.UpdateCanGoNext();
}
}
}
}

根据您放入的代码(缺少一些关键部分(,但我认为您应该使用TwoWay绑定:

<Slider x:Name="slider" 
Value="{Binding Value, Mode=TwoWay}"
Maximum="{Binding VM.Question.NumericMaxValue}"
/>

您也不需要为属性使用Nullable<double>(正如@jason-mentionned所说(,因为滑块控件总是有一个值。

为什么第二个绑定(Maximum属性(等于"VM.Question…"?Value绑定不一样吗?即:

Value="{Binding VM.Value, Mode=TwoWay}" -- ??

要仅在控件的拇指完成"移动"时更新值,应使用反应扩展。它允许您操作事件并选择一系列中的"最后"一个,例如:

Xamarin处方表单演示

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

最新更新