Xamarin绑定网格到ViewModel

时间:2018-11-21 14:26:19

标签: c# xamarin binding grid

是否可以将网格属性(行定义,列定义,行距,列距等)绑定到ViewModel?

1 个答案:

答案 0 :(得分:1)

查看源代码总是有帮助的:https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/Grid.cs#L20

因此,看起来行定义,列定义,行间距,列间距是可绑定的属性,如代码所示:

    public static readonly BindableProperty RowSpacingProperty = BindableProperty.Create("RowSpacing", ...);

    public static readonly BindableProperty ColumnSpacingProperty = BindableProperty.Create("ColumnSpacing", ...);

    public static readonly BindableProperty ColumnDefinitionsProperty = BindableProperty.Create("ColumnDefinitions", ...);

    public static readonly BindableProperty RowDefinitionsProperty = BindableProperty.Create("RowDefinitions", ...);

更新:因此,需要执行以下操作才能使绑定生效:

如果使用Bindings Value Converter,请确保它永远不会返回null。

然后,通过将Grid的TargetNullValueFallbackValue分配给一个空的Row / ColumnDefinitionCollection(例如,使用StaticResource)来防止任何绑定解析。

为此,请首先创建一个static resource,它只是App.xaml中的Row / ColumnDefinitionCollection:

<Application.Resources>
    <ResourceDictionary>
        <RowDefinitionCollection x:Key="NullRowDefs" />
        <ColumnDefinitionCollection x:Key="NullColDefs" />
    </ResourceDictionary>
</Application.Resources>

然后将Grid的TargetNullValueFallbackValue属性设置为上述静态资源:

 <Grid RowDefinitions="{Binding RowSize, TargetNullValue={StaticResource NullRowDefs}, FallbackValue={StaticResource NullRowDefs}}"
       ColumnDefinitions="{Binding ColumnSize, TargetNullValue={StaticResource NullColDefs}, FallbackValue={StaticResource NullColDefs}}"
       x:Name="grid">

执行上述操作将解决ArgumentException

更新:此绑定应在不提供TargetNullValueFallbackValue的情况下起作用。已发现一个bug,并创建了一个PR,因此应在即将发布的版本中对此进行修复,但与此同时,请使用变通方法。