【问题标题】:Binding slider ValueChanged event with Xamarin.Forms使用 Xamarin.Forms 绑定滑块 ValueChanged 事件
【发布时间】:2018-10-30 02:25:02
【问题描述】:

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

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

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

还有我的事件处理程序:

public void OnSliderValueChanged(object sender, EventArgs e)

我收到以下编译错误:

位置 15:21。在类型中找不到事件处理程序“OnSliderValueChanged” "MyApp.Views.SettingsPage"

我错过了什么?

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms binding


    【解决方案1】:

    位置 15:21。在类型中找不到事件处理程序“OnSliderValueChanged” "MyApp.Views.SettingsPage"

    表示您在MyApp.Views.SettingsPage 上没有名称为“OnSliderValueChanged”的EvenHandler。它应该在哪里,因为您在 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。代码示例可以在here 找到。但是,与我最初的提议相比,我觉得它有点过头了。

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        【解决方案3】:

        添加方法:

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

        在后面的代码中添加它。 您不需要处理您的事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2013-10-06
          • 1970-01-01
          相关资源
          最近更新 更多