Добавление новых столбцов во время выполнения - PullRequest
1 голос
/ 07 августа 2011

Я работаю в шаблоне Silverlight MVVM, есть сетка данных (компонент один), которая первоначально будет иметь 4 столбца, позже во время выполнения пользователю будет отображаться список столбцов в выпадающем списке, он может выбрать столбцы, которые он хочет видеть всетку данных и нажмите кнопку, чтобы добавить столбцы в сетку данных, поэтому во время выполнения я должен добавить столбец в сетку данных.Возможно ли использовать шаблон Silverlight MVVM.Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Конечно, это возможно.Вы определите сетку данных и привязку в xaml, затем вам нужно будет выполнить привязку данных и добавить столбцы в коде.Обязательно и отключите autoGenerateColumns.Я держу отдельный список, который описывает мои столбцы.Я также определяю шаблон столбца в коде, так как я хочу, чтобы всплывающая подсказка и заголовки были разными для каждого столбца.Вот пример, который добавляет либо столбец с плавающей точкой, либо целочисленный столбец, вы можете добавить другие типы, если вам нужно:

Сначала определите сетку - я не думаю, что это имеет значение, что вы используете компонент один Сетка данных

            <!-- NOTE: Creating columns is done Programmatically -->
            <sdk:DataGrid x:Name="DataGridForDistrictSummaries" Grid.Column="1" 
                              AutoGenerateColumns="False" 
                              VerticalScrollBarVisibility="Visible"  
                              HorizontalScrollBarVisibility="Visible" 
                              HorizontalAlignment="Stretch" 
                              VerticalAlignment="Stretch" 
                              MinHeight="70"
                              ItemsSource="{Binding dataGridView}"
                              AlternatingRowBackground="LightBlue"
                        >
           </sdk:DataGrid>

Затем вам нужно построить столбцы сетки, я перестрою всю сетку:

    public static void BuildDataGridColumns(DataGrid dataGrid, List<DataGridColumnDescription> columnDescriptionList)
    {
        // clear out the old columns and re-build them with new criteria
        dataGrid.Columns.Clear();

        // add columns based on the description
        int index = 0;
        foreach (DataGridColumnDescription column in columnDescriptionList)
        {
            if (DataGridColumnDescriptionValueType.floatDataType == column.valueType)
            {
                dataGrid.Columns.Add(DataGridColumnBuilder.CreateFloatColumn(index++, column.name, column.header, column.description));
            }
            else
            {
                dataGrid.Columns.Add(DataGridColumnBuilder.CreateIntColumn(index++, column.name, column.header, column.description));
            }
        }
    }

Это позволяет вам иметь различные типы данных в вашей сетке.Это важно для контроля того, как вы хотите отображать данные.В данном случае я хотел, чтобы отображались 2 десятичных знака

    public static DataGridTextColumn CreateFloatColumn(int index, string fieldName, string header, string description)
    {
        DataGridTextColumn column = new DataGridTextColumn();
        column.Header = header;
        column.HeaderStyle = BuildColumnHeaderStyle(description);
        column.Binding = new Binding("floatValuesList[" + index + "]");
        column.Binding.StringFormat = "0.00";
        column.CellStyle = BuildFloatCellStyle(fieldName, description);
        return column;
    }

    public static DataGridTextColumn CreateIntColumn(int index, string fieldName, string header, string description)
    {
        DataGridTextColumn column = new DataGridTextColumn();
        column.Header = header;
        column.HeaderStyle = BuildColumnHeaderStyle(description);
        column.Binding = new Binding("intValuesList[" + index + "]");
        column.CellStyle = BuildCellStyle(fieldName, description);
        return column;
    }

Это определяет стиль в коде, я жестко запрограммировал некоторые вещи - но вы можете сделать его настолько динамичным, насколько вам нужно:

    private static Style BuildColumnHeaderStyle(string tooltip)
    {
        FontWeight fw = FontWeights.Bold;
        Style newGridHeaderStyle = new Style(typeof(DataGridColumnHeader));
        newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.FontSizeProperty, Value = 9.0 });
        newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.FontWeightProperty, Value = FontWeights.Bold });
        newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.ContentTemplateProperty, Value = CreateDataGridColumnHeaderTemplate(tooltip) });
        return newGridHeaderStyle;
    }

    private static Style BuildFloatCellStyle(string fieldName, string tooltip)
    {
        Style newGridCellStyle = new Style(typeof(DataGridCell));
        newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.FontSizeProperty, Value = 11.0 });
        newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.HorizontalContentAlignmentProperty, Value = HorizontalAlignment.Right });
        return newGridCellStyle;
    }

    private static Style BuildCellStyle(string fieldName, string tooltip)
    {
        Style newGridCellStyle = new Style(typeof(DataGridCell));
        newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.FontSizeProperty, Value = 11.0 });
        newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.HorizontalContentAlignmentProperty, Value = HorizontalAlignment.Right });


        return newGridCellStyle;
    }

Вы также должны создать шаблон ячейки в коде.Это создает текстовую строку xaml и использует XamlReader для загрузки

    private static DataTemplate CreateDataGridColumnHeaderTemplate(string tooltip)
    {
        string str = @"<DataTemplate xmlns='http://schemas.microsoft.com/client/2007'>"
                    + @"<ContentControl   Content='{Binding}'>"
                    + @"<ToolTipService.ToolTip>"
                    + @"<ToolTip Content='" + tooltip + "'>"
                    + @"</ToolTip>"
                    + @"</ToolTipService.ToolTip>"
                    + @"</ContentControl >"
                    + @"</DataTemplate>";
        return (DataTemplate)XamlReader.Load(str);
    }
0 голосов
/ 04 декабря 2012

Ссылка: http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

Фрагмент кода приведен по ссылке выше (это один из способов сделать это. В этой ссылке также объясняется иное)

Xaml:

<UserControl.Resources>
<local:DateTimeConverter x:Key="DateConverter" />

<DataTemplate x:Key="myCellTemplate">
    <TextBlock 
        Text="{Binding Birthday, 
        Converter={StaticResource DateConverter}}" 
        Margin="4"/>
</DataTemplate>

<DataTemplate x:Key="myCellEditingTemplate">
    <basics:DatePicker 
        SelectedDate="{Binding Birthday, Mode=TwoWay}" />
</DataTemplate>

Код сзади:

DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Birthday";
templateColumn.CellTemplate = (DataTemplate)Resources["myCellTemplate"];
templateColumn.CellEditingTemplate = 
                   (DataTemplate)Resources["myCellEditingTemplate"];
targetDataGrid.Columns.Add(templateColumn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...