Home > Software design >  Create bindable property for ColumnDefinitionCollection in contenview Xamarin.forms
Create bindable property for ColumnDefinitionCollection in contenview Xamarin.forms

Time:09-01

I have a common ContentView which has been called in many ContentPages. Different pages have different requirements, according to the requirement, I want to change ColumnDefinition width property.

For Example:

On one page, There are three controls inside the Grid view, and the widths are ",1,"

<Grid ColumnDefinitions="*,1,*">

but on the other pages, I want to turn off the visibility of the first two controls, that is why I want to assign a width to Auto for the first two controls.

<Grid ColumnDefinitions="Auto,Auto,*">

In order to achieve this functionality, I have created bindable property.

public static readonly BindableProperty GridColumnDefinitionProperty =
            BindableProperty.Create(nameof(GridColumnDefinition), typeof(ColumnDefinitionCollection), typeof(PopupView), "*,1,*"); 

public ColumnDefinitionCollection GridColumnDefinition
        {
            get => (ColumnDefinitionCollection)GetValue(GridColumnDefinitionProperty);
            set => SetValue(GridColumnDefinitionProperty, value);
        }

but I am getting this error

System.ArgumentException: 'Default value did not match return type. Property: Xamarin.Forms.ColumnDefinitionCollection PopupView.GridColumnDefinition Default value type: String, Parameter name: defaultValue'

I am getting this error at the Bindable property line.

CodePudding user response:

For simple situations, an alternative approach is to create the needed ColumnDefinitions in code behind. With a bool property controlling when to do so.

<Grid x:Name="theGrid" ... />
public static readonly BindableProperty UseAutoColumnsProperty =
    BindableProperty.Create(nameof(UseAutoColumns), typeof(bool), typeof(ContentPage), false);
public bool UseAutoColumns
{
    get => (bool)GetValue(UseAutoColumnsProperty);
    set
    {
        SetValue(UseAutoColumnsProperty, value);

        if (value)
            theGrid.ColumnDefinitions = new ColumnDefinitionCollection
            {
                new ColumnDefinition(GridLength.Auto),
                new ColumnDefinition(GridLength.Auto),
                new ColumnDefinition(GridLength.Star),
            };
    }
}


  • Related