Как привязать ползунок к объекту Viewmodel в формах Xamarin?
Я новичок в форматах Xamarin и работаю с ним всего несколько месяцев. У меня есть приложение Xamarin forms, которое будет использоваться с Android и iOS и использует структуру MVVM. У меня есть ObservableCollection
объектов в моей модели ViewModel, которые я повторяю с помощью специального представления ретранслятора, которое расширяет StackLayout
и внутри DataTemplate
У меня есть собственный класс Entry, который расширяет запись, которая привязывает свой атрибут Text
к свойству Object Value
(значение NULL дважды).
Далее я хочу изменить шаблон, чтобы скрыть тег Entry
если определенное логическое значение, которое я добавляю в модель, имеет значение true, а затем отображает 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}" -- ??
Чтобы обновить значение только тогда, когда верхний палец управления завершил "перемещение", вы должны использовать реактивные расширения. Это позволяет вам манипулировать событиями и выбирать "последнюю" одну из серий, например:
Rx для представления форм Xamarin
Я позволил вам увидеть и проверить подробнее...