tags:

views:

3386

answers:

2

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

+1  A: 

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.

Matt Casto
When you say "key off the type of data being bound", I'm confused. If I create the data template in xaml, how do I change the binding for the checkbox at runtime? I don't know all of the columns at design time.
Rick Kierner
Sorry, I was getting Silverlight and WPF mixed up. In WPF you can set a type for a DataTemplate in order to use different templates for different types of objects being bound. In your situation I'd create multiple data templates and set the type of template to use at runtime.
Matt Casto
A: 

You can subcass checkbox in code and add event handler by overriding click method. In you xaml template use your subclassed checkbox instead of standard CheckBox class.

Andrus Moor