【问题标题】:Silverlight DataGrid Dynamic checkbox column needs click eventSilverlight DataGrid 动态复选框列需要点击事件
【发布时间】:2009-03-25 18:12:34
【问题描述】:

我有一个绑定到 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 [行:1 位置:110] 在 MS.Internal.XcpImports.MethodEx(IntPtr ptr,字符串名称,CValue [] cvData) 在 MS.Internal.XcpImports.MethodEx(DependencyObject obj, String name) 在 MS.Internal.XcpImports.DataTemplate_LoadContent(DataTemplate 模板) 在 System.Windows.DataTemplate.LoadContent() 在 System.Windows.Controls.DataGrid。在 System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow 行,DataGridColumn 列) 在 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) .Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex) 在 System.Windows.Controls.DataGrid.AddRows(Int32 rowIndex, Int32 rowCount) 在 System.Windows.Controls.DataGrid.RefreshR ows(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)

有什么想法吗?

谢谢,

瑞克

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    您不能在已设置事件处理程序的情况下动态加载 XAML。

    在这种情况下,我不会动态添加模板。相反,我会在用户控件的资源中创建两个数据模板,并让它们关闭绑定到网格的数据类型。

    【讨论】:

    • 当你说“关闭绑定的数据类型”时,我很困惑。如果我在 xaml 中创建数据模板,如何在运行时更改复选框的绑定?在设计时我不知道所有的列。
    • 抱歉,我把 Silverlight 和 WPF 搞混了。在 WPF 中,您可以为 DataTemplate 设置一个类型,以便为不同类型的绑定对象使用不同的模板。在您的情况下,我会创建多个数据模板并设置要在运行时使用的模板类型。
    【解决方案2】:

    您可以在代码中子类化复选框并通过覆盖单击方法添加事件处理程序。 在您的 xaml 模板中,使用您的子类复选框而不是标准 CheckBox 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 2013-09-11
      • 2011-03-08
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多