2016-06-18 6 views
1

문자열을 포함하는 각 열의 각 셀에 편집 가능한 ComboBox를 배치하는 자동 생성 GridView를 만들려고합니다. 각 열에 대해 선택할 수있는 항목은 DataTable의 해당 열에 이미있는 값과 일치해야합니다. 아래의 코드는 거의이를 수행하지만, 어떤 이유로 든 모든 열의 드롭 다운 목록을 마지막 열의 드롭 다운 목록으로 채 웁니다.AutoGeneratingColumn이 모든 드롭 다운 목록을 최종 열의 목록으로 채우는 이유는 무엇입니까?

private void dataGrid_AutoGeneratingColumn(object sender, 
     DataGridAutoGeneratingColumnEventArgs e) { 
     if (e.PropertyType == typeof(string)) { 
      DataGridTemplateColumn comboColumn = new DataGridTemplateColumn(); 
      comboColumn.Header = e.PropertyName; 
      comboColumn.CellTemplate = (DataTemplate)Resources["ComboBoxDataTemplate"]; 
      FrameworkElementFactory comboBoxFactory = new FrameworkElementFactory(typeof(ComboBox)); 
      List<string> list = (DataContext as MainVM).PartClassVM.DataTable.AsEnumerable() 
       .Select(row => row[e.PropertyName].ToString()).Distinct().ToList<string>(); 
      comboBoxFactory.SetValue(ComboBox.ItemsSourceProperty, list); 
      comboColumn.CellTemplate.VisualTree = comboBoxFactory; 
      e.Column = comboColumn; 
     } 
    } 

왜 이런 일이 일어나고 있는지, 주변을 어떻게 설명 할 수 있습니까? 미리 감사드립니다.

답변

0

ColumnType은 기본적으로 String 유형으로 설정됩니다.

그러나 당신이 당신의 DataTable을 채울 때, 당신은 명시 적으로 열의 유형을 설정할 수 있습니다 당신이 사용할 수있는

YourDataTable.Columns.Add("Column 1", typeof(bool)); 
YourDataTable.Columns.Add("Column 2", typeof(string)); 
YourDataTable.Columns.Add("Column 3", typeof(int)); 
YourDataTable.Columns.Add("Column 4", typeof(double)); 

및 유형에 따라 필요한 DataGridTemplateColumn :

if (e.PropertyType == typeof(string)) { 
    ... 
} 
else if(e.PropertyType == typeof(bool)) { 
    ... 
} 
else if(e.PropertyType == typeof(int)) { 
... 
} 

당신은 무엇을 볼 수 있습니다 종류 DataTable에서 지원 the MSDN article.

원한다면 DataTable을 사용하여 사용자 지정 유형 (예 : Person, Department, Car)을 지원할 수 있습니다. DataTable을 상속받은 사용자 정의 DataTable을 작성해야합니다.

업데이트 : - DataTemplate를 사용하지만, DataGrid을 채우기하지 난 잘 모르겠지만,

, 내보기에, AutoGeneratingColumn 이벤트는 열 (안 셀)을 사용자 정의 할 목표를 가지고있다.

목표는 MVVM 방식을 사용하여 DataTable에서 DataGridComboBoxColumn을 채우는 것입니다.

+0

여전히 열 A, B, C 및 D의 ComboBox에 대한 ItemsSource가 열 E의 선택 가능한 옵션 목록에 바인딩하는 것처럼 보이는 이유를 모르겠습니다. ColumnType이 string 유형으로 설정 되었기 때문입니다. 그것은 나를 위해 그것을 실제로 설명하지 않습니다. 그걸 좀 넓혀 줄래? – christiaantober

+0

제대로 이해했다면, 이제 모든'DataGridColumns'에'ComboBox'es'가 생깁니 까? 그러나'DataGridColumn'의 타입이'string' 일 때만'ComboBox'를'DataGridColumn'에 표시하고 싶습니까? 그렇다면, 모든 DataGridColumns가'string' 타입이기 때문에 발생합니다. 내가 너를 잘못 이해했는지 확인해 줘. – StepUp

+0

모든 DataGridColumns에 ComboBoxes가 있는데 원하는 것입니다. 그러나 모든 ComboBox Column이 제공하는 선택 가능한 옵션은 현재 { "LH1", "LH2", "RH1", "RH2"}입니다. 이는 최종 열에 대해서는 맞지만 다른 열에 대해서는 맞지 않습니다. 다른 열은 서로 다른 문자열 목록을 가져야합니다. – christiaantober