2013-08-22 3 views
0

ItemsSource가 DataTable로 설정된 DataGrid가 있습니다. DataTable에는 DateTime 유형의 열이 있으며 특정 셀의 날짜가 특정 값일 경우 정보 텍스트 (예 : "N/A")를 표시하려고합니다.DataGrid 셀 내용 변환

내 첫 번째 생각은 어떻게 든 셀 내용을 자체 바인딩하고 변환기를 사용하는 것이지만 올바르게 작동하지 않는 것처럼 보일 수 있으며 더 나은 방법이 있어야하는 것처럼 보입니다.

또한 DataGrid와 DataTable은 모두 동적으로 생성되므로 코드 뒤에 작성해야합니다.

// Create a new DataGridCellStyle 
Style myStyle = new Style(); 
myStyle.TargetType = typeof(DataGridCell); 

// Create the binding 
Binding myBinding = new Binding(); 
myBinding.RelativeSource = RelativeSource.Self; 
myBinding.Converter = new DateTimeToStringConverter(); 

// Add the Content setter 
Setter mySetter = new Setter(); 
mySetter.Property = ContentProperty; 
mySetter.Value = myBinding; 
myStyle.Setters.Add(setter); 

// Set the Style and ItemsSource 
myDataGrid.CellStyle = myStyle ; 
myDataGrid.ItemsSource = myDataTable.DefaultView; 

DateTimeToStringConverter는 IValueConverter를 구현 않지만, 데이터 그리드가 표시 될 때 DateTimeToStringConverter 실제로 호출되지 않기 때문에 나는이 문제를 추측하고있어, 어딘가 바인딩에있다 :

여기에 내가 처음 시도 코드입니다.

답변

1

은 처음에는 이름 세터 컬렉션 세터으로 변수를 추가,하지만 당신은 이름 mySetter으로 변수를 정의 할 수 있습니다. 컨버터가 실제로 호출되지 않는 이유가 될 수 있습니다.

또한 문제에 대한 해결책은 좀 더 복잡해집니다. 실제로 변환은 전체 행에 대한 데이터가 포함 된 RowDataView 유형의 값을 가져옵니다. 실제로 바인드 된 열이나 셀에 대한 정보는 변환기에 없습니다.

AutoGenerateColumns를 건너 뛰고 프로그래밍 방식으로 생성하는 것이 더 좋습니다. 성능이 더 좋을 만 날짜 시간 열 변환기를 사용하기위한, 물론

myDataGrid.ItemsSource = myDataTable.DefaultView; 
myDataGrid.AutoGenerateColumns = false; 

foreach (DataColumn column in myDataTable.Columns) 
{ 
    Binding binding = new Binding(column.ColumnName) 
     { 
      Converter = new DateTimeToStringConverter() 
     }; 
    DataGridColumn gridColumn = new DataGridTextColumn 
     { 
      SortMemberPath = column.ColumnName, 
      Header = column.ColumnName, 
      Binding = binding 
     }; 
    myDataGrid.Columns.Add(gridColumn); 
} 

: 여기 은 예입니다.