Связывание ползунка ValueChanged с событием Xamarin.Forms - PullRequest
0 голосов
/ 20 мая 2018

У меня есть слайдер на странице, и я пытаюсь реализовать шаг, чтобы слайдер допускал только целочисленные значения.

Чтобы добиться этого, я пытаюсь связать обработчик событий с ValueChanged событие.Вот мой код XAML:

<Slider ValueChanged="OnSliderValueChanged" Maximum="5" Minimum="1" Value="{Binding MaxProductsToOffer}"/>

И мой обработчик событий:

public void OnSliderValueChanged(object sender, EventArgs e)

Я получаю следующую ошибку компиляции:

Позиция 15:21.EventHandler "OnSliderValueChanged" не найден в типе "MyApp.Views.SettingsPage"

Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Ползунок в Xamarin Forms имеет явный ValueChangedEventArgs, поэтому ваш обработчик событий должен выглядеть следующим образом

public void OnSliderValueChanged(object sender, ValueChangedEventArgs e)

https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.slider.valuechanged?view=xamarin-forms

0 голосов
/ 20 мая 2018

Позиция 15:21.EventHandler "OnSliderValueChanged" не найден в типе "MyApp.Views.SettingsPage"

Означает, что у вас нет EvenHandler с именем "OnSliderValueChanged" в MyApp.Views.SettingsPage.Где это должно быть, так как вы указываете на это в XAML -> ValueChanged="OnSliderValueChanged".Поэтому либо определите его на своей странице, либо удалите его из XAML.

Относительно вашей проблемы, поскольку вы используете привязки Value="{Binding MaxProductsToOffer}" Я предполагаю, что вы придерживаетесь шаблона MVVM в своем проекте и у вас есть выделенный ViewModel привязан к MyApp.Views.SettingsPage.Если это так, то все, что вам нужно сделать, это связать Slider.Value с целочисленным свойством в ViewModel, которое будет автоматически обрабатывать преобразование для вас.Вот решение, которое не требует какого-либо кода:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:SliderTest"
    x:Class="SliderTest.MyPage"
    Padding="50">
    <ContentPage.BindingContext>
        <local:MainViewModel />
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <StackLayout>
        <Slider x:Name="slider" Maximum="5" Minimum="1" Value="{Binding SliderValue}" />
        <Label Text="{Binding Source={x:Reference Name=slider}, Path=Value}" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
    </StackLayout>
    </ContentPage.Content>
</ContentPage>

public class MainViewModel : INotifyPropertyChanged
{
    int sliderValue;
    public int SliderValue
    {
        get => sliderValue;
        set
        {
            sliderValue = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

В качестве альтернативы вы можете: расширить Slider и использовать частный EventHandler для манипулирования значением или использовать EventHandler на вашей странице.Пример кода можно найти здесь .Однако я нахожу это излишним сравнением с моим первоначальным предложением.

PS: Если вы используете MVVM, предпочитайте решения, которые не предполагают написание кода на уровне пользовательского интерфейса, если это действительно не нужно.

0 голосов
/ 20 мая 2018

Добавьте метод:

void OnSliderValueChanged(object sender, EventArgs e)
{
...
}

Добавьте его в коде позади.Вам не нужно обрабатывать ваше событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...