2011-08-07 47 views
1

我在Silverlight MVVM模式下工作,有一個datagrid(組件一),最初將有4列,稍後在運行時用戶將顯示列表中的組合框,他可以選擇列他希望在datagrid中看到並單擊按鈕以在datagrid中添加列,因此在運行時我必須將該列添加到datagrid中。是否有可能使用Silverlight MVVM模式。請幫忙。在運行時添加新列

回答

1

確定這是可能的。您將在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

參考鏈接:http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

代碼來自上面的鏈接:(這是做着that.Otherway在這也解釋了一種方法鏈接)

的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);