[英]How to databind a Slider to Viewmodel property in Xamarin forms?
我是Xamarin表单的新手,仅使用了几个月。 我有一个Xamarin表单应用程序,该应用程序将与Android和iOS一起使用,并且正在使用MVVM结构。 我在ViewModel中有一个对象的ObservableCollection
对象,我正在使用扩展StackLayout
的自定义中继器视图进行迭代,并且在DataTemplate
内部有一个自定义Entry类,该类扩展了Entry,该类将其Text
属性绑定到对象的Value
属性(可为null双)。
我接下来要做的是,如果要添加到模型中的某个布尔值具有true值,则修改模板以隐藏Entry
标签,然后显示Slider
和Label
,以显示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所述),因为滑块控件始终具有一个值。
为什么第二个绑定( Maximum
属性)等于“ VM.Question
...”? Value
绑定不一样吗? 即:
Value="{Binding VM.Value, Mode=TwoWay}" -- ??
若要仅在控件的拇指完成“移动”后才更新值,应使用反应性扩展。 它允许您处理事件并选择一个“意向”之一,例如:
我让您查看并检查更多详细信息...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.