我有一个绑定到observablecollection对象的数据网格。该集合可以是Foo的集合或Bar对象的集合。 Foo和Bar具有不同数量的属性,因此在数据网格中应具有不同数量的列。
因此我在数据网格中动态创建列:
var cellEditTemplate = new StringBuilder();
cellEditTemplate.Append("<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' >");
cellEditTemplate.Append(
"<CheckBox VerticalAlignment=\"Center\" IsThreeState=\"False\" IsChecked=\"{Binding ");
cellEditTemplate.Append(bindName);
cellEditTemplate.Append(", Mode=TwoWay}\"/>");
cellEditTemplate.Append("</DataTemplate> ");
var dataTemplate = ((DataTemplate) XamlReader.Load(cellEditTemplate.ToString()));
var column = new DataGridTemplateColumn
{
CellEditingTemplate = dataTemplate,
Header = title
};
grdCheckList.Columns.Add(column);
在创建所有模板并将它们添加到DataGrid后,我将数据绑定到DataGrid。显示正确的数据。我的问题是我没有收到选中复选框的通知。
如果我添加
点击=“CheckBox_Checked”,
我收到以下错误:
Sys.InvalidOperationException:控件'sl_Main'中的ManagedRuntimeError错误#4004:System.Windows.Markup.XamlParseException:AG_E_PARSER_BAD_PROPERTY_VALUE [Line:1 Position:110] at MS.Internal.XcpImports.MethodEx(IntPtr ptr,String name,CValue [] cvData)位于System.Windows.Controls.DataGrid的System.Windows.DataTemplate.LoadContent()的MS.Internal.XcpImports.DataTemplate_LoadContent(DataTemplate模板)中的MS.Internal.XcpImports.MethodEx(DependencyObject obj,String name)。系统中的System.Windows.Controls.DataGrid.CompleteCellsCollection(DataGridRow dataGridRow)中的System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow行,DataGridColumn列)中的PopulateCellContent(Boolean forceTemplating,Boolean isCellEdited,DataGridColumn dataGridColumn,DataGridRow dataGridRow,DataGridCell dataGridCell) System.Windows.Controls.DataGrid.RefreshR上的System.Windows.Controls.DataGrid.AddRows(Int32 rowIndex,Int32 rowCount)中的.Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex) System.Windows.FrameworkElement.MeasureOverride上的System.Windows.Controls.DataGrid.MeasureOverride(Size availableSize)中的System.Windows.Controls.DataGrid.RefreshRowsAndColumns()处的ows(布尔值recycleRows)(Int in InTtr nativeTarget,Single inWidth,Single inHeight,Single&amp; ; outWidth,Single&amp; outHeight)
任何想法?
谢谢,
瑞克
答案 0 :(得分:1)
您无法使用已设置的事件处理程序动态加载XAML。
在这种情况下,我不会动态添加模板。相反,我会在用户控件的资源中创建两个数据模板,并让它们键入绑定到网格的数据类型。
答案 1 :(得分:0)
您可以在代码中设置subcass复选框,并通过覆盖click方法添加事件处理程序。 在你的xaml模板中使用你的子类复选框而不是标准的CheckBox类。