我在页面上有一个滑块,我正在尝试实现一个步骤,以便滑块只允许整数值。
为了实现这一点,我尝试将事件处理程序与 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;
我错过了什么?
答案 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层编写代码,除非确实有必要。