Rick Kierner
Rick Kierner

Reputation: 714

Silverlight DataGrid Dynamic checkbox column needs click event

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

Upvotes: 0

Views: 6196

Answers (2)

Andrus Moor
Andrus Moor

Reputation: 1

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.

Upvotes: 0

Matt Casto
Matt Casto

Reputation: 2170

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.

Upvotes: 1

Related Questions