使用Xamarin.Forms绑定滑块ValueChanged事件

时间:2018-05-20 04:45:25

标签: c# xaml xamarin xamarin.forms binding

我在页面上有一个滑块,我正在尝试实现一个步骤,以便滑块只允许整数值。

为了实现这一点,我尝试将事件处理程序与 ValueChanged 事件相关联。这是我的XAML代码:

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

我的事件处理程序:

public void OnSliderValueChanged(object sender, EventArgs e)

我收到以下编译错误:

  

位置15:21。 EventHandler&#34; OnSliderValueChanged&#34;没有在类型中找到   &#34; MyApp.Views.SettingsPage&#34;

我错过了什么?

3 个答案:

答案 0 :(得分:0)

添加方法:

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

在代码中添加它。 您不需要处理您的活动。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

位置15:21。 EventHandler&#34; OnSliderValueChanged&#34;没有在类型中找到   &#34; MyApp.Views.SettingsPage&#34;

意味着您没有EvenHandler名称为&#34; OnSliderValueChanged&#34;在MyApp.Views.SettingsPage。因为你在XAML中指向它所应该的位置 - &gt; 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。可以找到代码示例here。但是我觉得这与我原来的提案相比有点过分了。

P.S。:如果您使用MVVM首选解决方案,不涉及在UI层编写代码,除非确实有必要。