繁体   English   中英

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

[英]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标签,然后显示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所述),因为滑块控件始终具有一个值。

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

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

若要仅在控件的拇指完成“移动”后才更新值,应使用反应性扩展。 它允许您处理事件并选择一个“意向”之一,例如:

Xamarin的Rx表单演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM