Как привязать ползунок к объекту Viewmodel в формах Xamarin?

141
14

Я новичок в форматах 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();
}
}
}
}

спросил(а) 2021-01-19T18:33:25+03:00 6 месяцев, 1 неделя назад
1
Решение
79

Из кода, который вы положили (есть некоторые недостающие ключевые части), но я полагаю, вы должны использовать привязку 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

Я позволил вам увидеть и проверить подробнее...

ответил(а) 2021-01-19T18:33:25+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема