如何在自定义可绑定属性上创建与Intellisense兼容的枚举

时间:2019-06-07 20:26:24

标签: c# visual-studio xaml xamarin.forms

作为示例,我将引用Xamarin Forms中的Label控件。它有一个名为FontSize的属性,类型为double。

/// <summary>Gets the size of the font for the label.</summary>
/// <value>To be added.</value>
/// <remarks>To be added.</remarks>
[TypeConverter(typeof (FontSizeConverter))]
public double FontSize
{
  get
  {
    return (double) this.GetValue(Label.FontSizeProperty);
  }
  set
  {
    this.SetValue(Label.FontSizeProperty, (object) value);
  }
}

即使它只允许您在编写时加倍

<Label FontSize=""

它为您提供了一些选择(请参见下图),但实际上它接受枚举值和双精度值。

enter image description here

我以为是[TypeConverter(typeof (FontSizeConverter))]才使这成为可能,但是当我创建具有相同属性的自定义属性时,并没有解决问题。

所以我想拥有一个类型为double,int,string或其他类型的自定义属性,但显示枚举中的一些预定义选项,这些类型将由类型转换器处理。

编辑:我的自定义TypeConverter正常工作,但是问题在于:

  1. 它在XAML上没有Intellisense
  2. 它在XAML Invalid value for property 'FontSize': 'XXSmall'上显示错误,但仍可编译并正常运行

1 个答案:

答案 0 :(得分:2)

要使它适用于FontSize,要比将TypeConverter添加到主项目还要多一些。

Forms为设计器提供了一个特定的DLL,该DLL可以构建该列表,以便它可以显示所有可用的命名字体大小,而且不会引发错误

https://github.com/xamarin/Xamarin.Forms/blob/55937add669a422d5974fcb057c193d64f7a3a05/Xamarin.Forms.Core.Design/AttributeTableBuilder.cs#L31

然后Forms将该DLL打包到所有不同目标https://github.com/xamarin/Xamarin.Forms/blob/master/.nuspec/Xamarin.Forms.nuspec#L137

的nuget包的Design目录中。

Forms在Visual中也做类似的事情,因此它也可以在智能感知中显示这些