I have a datagrid that’s bound to an observablecollection object. The collection may be a collection of Foo or a collection of Bar objects. Foo and Bar have different number of properties and therefore should have a different number of columns in the Data Grid.
Because of this I am dynamically creating the columns in my data grid:
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);
After I create all of the templates and add them to the DataGrid, I bind the data to the DataGrid. The correct data shows up. My problem is that I don’t get notification of when the checkbox is checked.
If I add
Click=’CheckBox_Checked’,
I get the following error:
Sys.InvalidOperationException: ManagedRuntimeError error #4004 in control ‘sl_Main’: 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) at MS.Internal.XcpImports.MethodEx(DependencyObject obj, String name) at MS.Internal.XcpImports.DataTemplate_LoadContent(DataTemplate template) at System.Windows.DataTemplate.LoadContent() at System.Windows.Controls.DataGrid.PopulateCellContent(Boolean forceTemplating, Boolean isCellEdited, DataGridColumn dataGridColumn, DataGridRow dataGridRow, DataGridCell dataGridCell) at System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow row, DataGridColumn column) at System.Windows.Controls.DataGrid.CompleteCellsCollection(DataGridRow dataGridRow) at System.Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex) at System.Windows.Controls.DataGrid.AddRows(Int32 rowIndex, Int32 rowCount) at System.Windows.Controls.DataGrid.RefreshRows(Boolean recycleRows) at System.Windows.Controls.DataGrid.RefreshRowsAndColumns() at System.Windows.Controls.DataGrid.MeasureOverride(Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
any ideas?
Thanks,
Rick
You can’t dynamically load XAML with event handlers already set up.
I wouldn’t be adding templates dynamically in this situation. Instead, I would create two data templates in the user control’s resources, and have them key off of the type of data being bound to the grid.