代码之家  ›  专栏  ›  技术社区  ›  Toto

使用Xamarin绑定slider ValueChanged事件。形式

  •  1
  • Toto  · 技术社区  · 6 年前

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

    为了实现这一点,我试图将事件处理程序与 价值改变 事件以下是我的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 回复  |  直到 6 年前
        1
  •  1
  •   Johannes    6 年前

    Xamarin表单中的滑块具有明确的 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
  •   random    6 年前

    添加以下方法:

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

    将其添加到代码隐藏中。 您不需要处理事件。

        3
  •  0
  •   EvZ    6 年前

    位置15:21。在类型中找不到EventHandler“OnSliderValueChanged” “MyApp.Views.SettingsPage”

    意味着你没有 EvenHandler 名为“OnSliderValueChanged”的 MyApp.Views.SettingsPage .它应该在哪里,因为您在XAML中指向它-> ValueChanged="OnSliderValueChanged" . 因此,要么在页面中定义它,要么将其从XAML中删除。

    关于您的问题,因为您使用的是绑定 Value="{Binding MaxProductsToOffer}" 我假设您在项目中遵循MVVM模式,并且您有一个专门的 ViewModel 一定要 我的应用。意见。设定值 .如果是这样,你所要做的就是绑起来 Slider.Value 设置为 视图模型 这将自动为您处理转换。以下是一个不需要任何代码隐藏的解决方案:

    <?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 .然而,与我最初的提议相比,我觉得这太过分了。

    注意:如果你使用的是MVVM,你会选择不需要在UI层编写代码的解决方案,除非真的有必要。