我正在使用为我的 MAUI 项目制作的自定义控件。在此控件中,我有一个应该是 GridLength 类型的属性,但当我在项目中使用它时,它会引发错误:“值不能为空”。我还尝试将属性声明为字符串并手动转换为 GridLength,但我的 Binding 仍然不起作用,并且当我在 setter 中添加断点时,调试器永远不会到达它。
我的自定义属性的代码:
public static readonly BindableProperty SpaceBetweenProperty = BindableProperty.Create(nameof(SpaceBetween), typeof(GridLength), typeof(IconButton), new GridLength(0.0));
[TypeConverter(typeof(GridLength))]
public GridLength SpaceBetween
{
get => (GridLength)GetValue(SpaceBetweenProperty);
set
{
SetGridColumns(value);
SetValue(SpaceBetweenProperty, value);
}
}
// ...
private void SetGridColumns(GridLength SpaceBetween)
{
IBGrid.ColumnDefinitions = [
new ColumnDefinition(GridLength.Star),
new ColumnDefinition(GridLength.Auto),
new ColumnDefinition(SpaceBetween),
new ColumnDefinition(GridLength.Auto),
new ColumnDefinition(GridLength.Star),
];
}
我如何在我的 xaml 文件中使用它:
<utils:IconButton Grid.Column="1" Margin="5" IconMargin="10" SpaceBetween="10" LabelText="{Binding MyText}" FontSize="Large" ImageSource="road_sign_warning.svg" ButtonClicked="OnButtonClicked" IconSizeRequest="32" HorizontalOptions="End"/>
(值得注意的是,在添加该自定义属性之前,并且当我的此类自定义控件都没有 SpaceBetween 属性时,我没有编译问题,并且应用程序在没有默认值的情况下运行。)
我收到的错误消息:“值不能为空”,根本没有错误代码。
如果要在网格中设置行和列之间的间距,请使用
RowSpacing
和 ColumnSpacing
属性。
如果您的
SpaceBetween
属性有其他含义,则将其设为 double
类型(或特殊情况下的字符串)
使用GridLength Struct时,需要将TypeConverter设置为
[TypeConverter(typeof(GridLengthTypeConverter))]
,如以下代码:
[TypeConverter(typeof(GridLengthTypeConverter))]
public GridLength SpaceBetween
{
get => (GridLength)GetValue(SpaceBetweenProperty);
set
{
SetGridColumns(value);
SetValue(SpaceBetweenProperty, value);
}
}
更多详情,可以参考GridLength结构体定义