如何为MAUI/Xamarin Forms附加属性应用ColumnDefinitionCollectionTypeConverter?
解决Xamarin Forms/MAUI中附加属性应用ColumnDefinitionCollectionTypeConverter的问题
我希望使用Xamarin Forms/MAUI提供的ColumnDefinitionCollectionTypeConverter,该转换器支持通过特定格式输入定义Grid的列。但需要将其应用到附加属性上,通常该转换器用于普通绑定属性。尝试将其标记在Setter方法上,但无法生效,代码如下:
public static readonly BindableProperty ColumnDefinitionsProperty = BindableProperty.CreateAttached( "ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(PH), default(ColumnDefinitionCollection), propertyChanged: ColumnDefinitionsChanged); [TypeConverter(typeof(ColumnDefinitionCollectionTypeConverter))] public static void SetColumnDefinitions(BindableObject element, ColumnDefinitionCollection value) => element.SetValue(ColumnDefinitionsProperty, value); public static ColumnDefinitionCollection GetColumnDefinitions(BindableObject element) => (ColumnDefinitionCollection)element.GetValue(ColumnDefinitionsProperty);
可行解决办法
不要把TypeConverter特性标记在Setter方法上,而是直接在附加属性的定义阶段指定转换器:
修改BindableProperty.CreateAttached方法,添加defaultValueConverter参数并传入ColumnDefinitionCollectionTypeConverter的实例,具体代码如下:
public static readonly BindableProperty ColumnDefinitionsProperty = BindableProperty.CreateAttached( "ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(PH), default(ColumnDefinitionCollection), propertyChanged: ColumnDefinitionsChanged, defaultValueConverter: new ColumnDefinitionCollectionTypeConverter()); public static void SetColumnDefinitions(BindableObject element, ColumnDefinitionCollection value) => element.SetValue(ColumnDefinitionsProperty, value); public static ColumnDefinitionCollection GetColumnDefinitions(BindableObject element) => (ColumnDefinitionCollection)element.GetValue(ColumnDefinitionsProperty);
原理说明
附加属性的类型转换逻辑由绑定属性本身负责处理,而非Setter方法。通过在创建附加属性时指定defaultValueConverter,Xamarin Forms/MAUI会自动使用该转换器处理XAML中输入的字符串格式列定义,行为与原生Grid的ColumnDefinitions属性完全一致。
内容的提问来源于stack exchange,提问作者Rudy Spano
相关产品推荐
相关产品推荐

