未设置自定义控件的自定义 属性 - xamarin 表单
Custom property of a custom control not being set - xamarin forms
我正在尝试使用 EntryType 属性 创建一个自定义条目控件,然后我在自定义渲染器中使用它来设置特定于平台的值。但是从 Xaml 开始使用时从未设置 EntryType。这是我的代码:
public class ExtendedEntry : Xamarin.Forms.Entry
{
public static readonly BindableProperty EntryTypeProperty = BindableProperty.Create(
propertyName: "EntryType",
returnType: typeof(int),
declaringType: typeof(EntryTextType),
defaultValue: 1
);
public EntryTextType EntryType
{
get
{
return (EntryTextType)GetValue(EntryTypeProperty);
}
set
{
SetValue(EntryTypeProperty, value);
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == EntryTypeProperty.PropertyName)
{
}
}
}
public enum EntryTextType
{
Any,
Numeric,
Url,
Email
}
public class ExtendedEntryRenderer : EntryRenderer
{
public ExtendedEntryRenderer(Android.Content.Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var element = (ExtendedEntry)Element;
Control.Hint = element.Placeholder;
switch(element.EntryType)
{
case EntryTextType.Numeric:
Control.SetRawInputType(Android.Text.InputTypes.ClassNumber);
break;
default:
break;
}
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var p = e.PropertyName;
base.OnElementPropertyChanged(sender, e);
}
}
然后在XAML中,我这样使用控件:
<controls:ExtendedEntry Placeholder="Password" IsPassword="True" Text="{Binding Secret}" EntryType="Any"/>
问题是,EntryType 永远不会设置为 EntryTextType.Any,并且始终使用默认值 EntryTextType.Numeric。我在这里错过了什么?谢谢。
我注意到 EntryTypeProperty
声明中存在一些差异。
- 声明类型应该是
ExtendedEntry
的所有者
- 并且,要指示 XAML 使用枚举
TypeConverter
,您必须将数据类型定义为 EntryTextType
因此您的新代码将如下所示:
public static readonly BindableProperty EntryTypeProperty = BindableProperty.Create(
propertyName: "EntryType",
returnType: typeof(EntryTextType),
declaringType: typeof(ExtendedEntry),
defaultValue: EntryTextType.Numeric
);
我正在尝试使用 EntryType 属性 创建一个自定义条目控件,然后我在自定义渲染器中使用它来设置特定于平台的值。但是从 Xaml 开始使用时从未设置 EntryType。这是我的代码:
public class ExtendedEntry : Xamarin.Forms.Entry
{
public static readonly BindableProperty EntryTypeProperty = BindableProperty.Create(
propertyName: "EntryType",
returnType: typeof(int),
declaringType: typeof(EntryTextType),
defaultValue: 1
);
public EntryTextType EntryType
{
get
{
return (EntryTextType)GetValue(EntryTypeProperty);
}
set
{
SetValue(EntryTypeProperty, value);
}
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == EntryTypeProperty.PropertyName)
{
}
}
}
public enum EntryTextType
{
Any,
Numeric,
Url,
Email
}
public class ExtendedEntryRenderer : EntryRenderer
{
public ExtendedEntryRenderer(Android.Content.Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var element = (ExtendedEntry)Element;
Control.Hint = element.Placeholder;
switch(element.EntryType)
{
case EntryTextType.Numeric:
Control.SetRawInputType(Android.Text.InputTypes.ClassNumber);
break;
default:
break;
}
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var p = e.PropertyName;
base.OnElementPropertyChanged(sender, e);
}
}
然后在XAML中,我这样使用控件:
<controls:ExtendedEntry Placeholder="Password" IsPassword="True" Text="{Binding Secret}" EntryType="Any"/>
问题是,EntryType 永远不会设置为 EntryTextType.Any,并且始终使用默认值 EntryTextType.Numeric。我在这里错过了什么?谢谢。
我注意到 EntryTypeProperty
声明中存在一些差异。
- 声明类型应该是
ExtendedEntry
的所有者
- 并且,要指示 XAML 使用枚举
TypeConverter
,您必须将数据类型定义为EntryTextType
因此您的新代码将如下所示:
public static readonly BindableProperty EntryTypeProperty = BindableProperty.Create(
propertyName: "EntryType",
returnType: typeof(EntryTextType),
declaringType: typeof(ExtendedEntry),
defaultValue: EntryTextType.Numeric
);