Используя XAML и Silverlight 4, есть ли способ построить строки и столбцы динамической GRID из привязки данных? - PullRequest
2 голосов
/ 30 июля 2010

Я пытаюсь динамически определять строки и столбцы сетки, используя привязку данных только в XAML.

Я знаю, что могу использовать для этого код, но я ищу способ сделать это чистов XAML.

Есть мысли?

1 Ответ

2 голосов
/ 30 июля 2010

Хорошо, после большого прочтения в сети я кодировал следующее решение:

public class DynamicGrid : Grid
{
    public static readonly DependencyProperty NumColumnsProperty =
        DependencyProperty.Register ("NumColumns", typeof (int), typeof (DynamicGrid), 
        new PropertyMetadata ((o, args) => ((DynamicGrid)o).RecreateGridCells()));

    public int NumColumns
    {
        get { return (int)GetValue(NumColumnsProperty); }
        set { SetValue (NumColumnsProperty, value); }
    }


    public static readonly DependencyProperty NumRowsProperty =
        DependencyProperty.Register("NumRows", typeof(int), typeof(DynamicGrid),
        new PropertyMetadata((o, args) => ((DynamicGrid)o).RecreateGridCells()));

    public int NumRows
    {
        get { return (int)GetValue(NumRowsProperty); }
        set { SetValue (NumRowsProperty, value); }
    }

    private void RecreateGridCells()
    {
        int numRows = NumRows;
        int currentNumRows = RowDefinitions.Count;

        while (numRows > currentNumRows)
        {
            RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            currentNumRows++;
        }

        while (numRows < currentNumRows)
        {
            currentNumRows--;
            RowDefinitions.RemoveAt(currentNumRows);
        }

        int numCols = NumColumns;
        int currentNumCols = ColumnDefinitions.Count;

        while (numCols > currentNumCols)
        {
            ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
            currentNumCols++;
        }

        while (numCols < currentNumCols)
        {
            currentNumCols--;
            ColumnDefinitions.RemoveAt(currentNumCols);
        }

        UpdateLayout();
    }
}

Это работает, но я не уверен, что это оптимальное решение.Любые комментарии по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...