2011-08-07 9 views
1

私はSilverlight MVVMパターンで作業していますが、最初に4列のデータグリッド(コンポーネント1)があり、後で実行時にコンボボックスの列のリストが表示され、列を選択できます彼はデータグリッドを見て、ボタンをクリックしてDataGridに列を追加したいので、実行時にはその列をDataGridに追加する必要があります。 Silverlight MVVMパターンを使用することは可能ですか?助けてください。実行時に新しい列を追加する

答えて

1

確かに可能です。 xamlでデータグリッドとバインディングを定義したら、データバインディングとコード内の列の追加が必要になります。必ず、autoGenerateColumnsをオフにしてください。私は私の列を記述する別のリストを保持します。私は、ツールチップとヘッダを各列ごとに異なるものにしたいので、コード内に列テンプレートも定義します。 float列またはinteger列を追加する例を次に示します。

最初にグリッドを定義する - コンポーネント1のデータグリッドを使用しているとは思わない

これはあなたのグリッド内の異なるデータ型を持つことができます

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

  <!-- 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 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; 
    } 

を表示するには、2進ポイントを望んでいた、私はハードいくつかのことをコード化しました - しかし、あなたはあなたが必要として、それは、動的にすることができます。

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のテキスト文字列を作成し、リンク参照してください

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

それをロードするためにXamlReaderを使用しています。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); 
関連する問題