Search code examples
c#wpfxaml

Is there a simple way to describe a list of equal objects in XAML?


I have a list of 34 column definitions, the list looks as follows:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
    <ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>

Is there an easier way to do this? The amount is fixed.


Solution

  • You can either use an UniformGrid (like said in the comment). The content will be added column after column.

    <UniformGrid Columns="34">
        <Label/> <!--c1-->
        <Label/> <!--c2-->
        <Label/> <!--c3-->
        <!-- ... -->
    </UniformGrid>
    

    Or create a class, inherit from Grid and add a property for the number of columns. You will keep the behaviour of a Grid.

    class GridWithFixedNbrCol : Grid
    {
        public int Columns
        {
            get { return ColumnDefinitions.Count; }
            set
            {
                ColumnDefinitions.Clear();
                for (int i = 0; i < value; i++)
                    ColumnDefinitions.Add(new ColumnDefinition());
            }
        }
    }
    

    The content is added in the right column with Grid.Column like a normal grid

    <local:GridWithFixedNbrCol Columns="34">
        <Label Grid.Column="2"/>
        <Label Grid.Column="17"/>
        <Label Grid.Column="18"/>
    </local:GridWithFixedNbrCol>