我在Silverlight MVVM模式下工作,有一個datagrid(組件一),最初將有4列,稍後在運行時用戶將顯示列表中的組合框,他可以選擇列他希望在datagrid中看到並單擊按鈕以在datagrid中添加列,因此在運行時我必須將該列添加到datagrid中。是否有可能使用Silverlight MVVM模式。請幫忙。在運行時添加新列
Q
在運行時添加新列
1
A
回答
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
代碼來自上面的鏈接:(這是做着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);
相關問題
- 1. 如何在運行時添加新列?
- 2. 在DataGridView中添加新列並在運行時設置新值
- 3. PDFBox在運行時添加新頁面
- 4. 在運行時添加新頁面
- 5. 在運行時向ASP.NET GridView添加列
- 6. Silverlight DataGrid - 在運行時添加列
- 7. ShieldUI Grid - 在運行時添加列
- 8. VBA在運行時添加到陣列
- 9. 在運行時添加stringgrid列
- 10. 在運行時添加QRadioButtons
- 11. 在運行時添加PictureBoxes
- 12. 在運行時添加ContextMenuStipItem
- 13. 添加和在運行時
- 14. 在DataGridView中添加新行[在運行時]替換以前添加的行
- 15. 向CloudFoundry添加新運行時
- 16. 在VB6運行時在vaSpread中添加新行
- 17. 在運行時在WPF RichTextBox的新行中添加文本
- 18. 在運行時在列表中添加行內容
- 19. 在運行時向表中添加行
- 20. 在運行時添加和刪除行
- 21. GridView在運行時逐行添加
- 22. 如何在運行時向JXTable添加新行?
- 23. 麻煩添加新行到datagridview在運行時使用c#
- 24. 在運行時將行和列添加到WPF數據網格
- 25. 在運行時在IOS中添加texfield
- 26. 添加在運行時作爲在Eclipse
- 27. 添加RequiredFieldValidator運行時
- 28. 我如何添加新的面板在運行時在asp.net
- 29. 如何添加新行/列
- 30. 新行/列表中添加