2009-03-25 4 views
0

observablecollection 개체에 바인딩 된 DataGrid가 있습니다. 콜렉션은 Foo 콜렉션이거나 Bar 오브젝트 콜렉션 일 수 있습니다. Foo와 Bar는 속성 수가 다르므로 Data Grid에서 다른 수의 열을 가져야합니다. 이 때문에Silverlight DataGrid 동적 체크 상자 열에 클릭 이벤트가 필요합니다.

는 동적으로 내 데이터 그리드의 열을 만드는 오전 : 나는 모든 템플릿을 생성하고 데이터 그리드에 추가 한 후

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); 

, 나는 데이터 그리드에 데이터를 바인딩합니다. 올바른 데이터가 표시됩니다. 내 문제는 내가 확인란을 선택하면 알림을받지 않는다는 것입니다.

내가

클릭 = "CheckBox_Checked는"추가하면,

다음과 같은 에러가 발생

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)

어떤 아이디어? 당신은 동적으로 이벤트 핸들러와 XAML을로드 할 수 없습니다

감사합니다,

답변

1

가 이미 설정합니다.

이 상황에서는 동적으로 템플릿을 추가하지 않을 것입니다. 대신, 사용자 정의 컨트롤의 리소스에 두 개의 데이터 템플릿을 만들고 그리드에 바인딩되는 데이터 형식의 키를 가져와야합니다.

+0

"바인딩되는 데이터의 유형을 해제하십시오"라고 말하면 혼란 스럽습니다. xaml에서 데이터 템플릿을 만들면 런타임에 확인란의 바인딩을 어떻게 변경합니까? 디자인 타임에 모든 열을 알 수는 없습니다. –

+0

죄송합니다. Silverlight와 WPF가 섞여 있습니다. WPF에서는 바인딩되는 여러 유형의 객체에 대해 서로 다른 템플릿을 사용하기 위해 DataTemplate의 유형을 설정할 수 있습니다. 귀하의 상황에서 나는 여러 개의 데이터 템플릿을 만들고 런타임에 사용할 템플릿의 유형을 설정합니다. –

0

코드에서 체크 박스를 하위 분류하고 click 메소드를 재정 의하여 이벤트 처리기를 추가 할 수 있습니다. xaml 템플릿에서 표준 CheckBox 클래스 대신 하위 클래스 확인란을 사용하십시오.

관련 문제