2014-06-12 3 views
0

많은 주제를 살펴 보았지만 문제점에 대한 해결책을 찾지 못했습니다. 찾은 것을 다시 사용할 수 없습니다.DataGridComboBoxColumn을 WPF의 DataSet에 바인딩

2 개의 테이블에 대한 SQL 쿼리로 채워진 DataSet을 만들었습니다. 내 데이터 집합이 올로 (내가 그것을 확인) 가득,

SELECT table1.reference, table2.reference, table1.category... 
FROM table1, table2 
WHERE table1.reference = table2.reference 
... 
dataAdapter.Fill(dataSetGrid, "table1"); 

내 DataContext를가 올바른지 : 그들은 모두 공통 필드가 힘든 가지고 있지만 외부 키 (묻지 않는다, 나는 그것을 바꿀 수 없습니다) 값은 내가하여 데이터 그리드의 ItemsSource을 설정

this.grid1.ItemsSource = dataSetGrid.Tables[0].DefaultView; 

그리고 나는 많은 것들을 시도했지만 내가 할 수있는 최선 내 콤보 상자에 있지만, 각 행의 1 개 문자로 첫 번째 요소입니다.

XAML 코드에서 내 시험의

하나 :

<DataGridComboBoxColumn Header="Caméras" 
         x:Name="Cameras" 
         ItemsSource="{Binding article}" 
         SelectedValuePath="reference" 
         DisplayMemberPath="reference" 
         Width="*"/> 

이 사람은 나에게 빈 콤보 상자 제공하지만, 내가 DataGridTextColumn에 아무 문제도 없어.

클래스의 ObservableCollection에서 작동하지만 지금은 데이터 세트를 사용할 수 있기를 바랍니다 (성능이 향상되었습니다).

도움을 주셔서 감사 드리며 미안합니다.

+0

데이터 액세스 코드를 사용하여'DataTable'을 그대로두고 UI에 표시하기위한 데이터가있는 사용자 정의 클래스 인스턴스를 채우면 WPF 개발자로서의 삶이 훨씬 쉬워집니다. – Sheridan

+0

@Sheridan 그래, 그게 내가 처음 했어, 완벽하게 작동하지만 500 개가 넘는 레코드를 가질 수 있기 때문에 나는 collection.Add (new Class (param))을 피하기 때문에 DataSet을 사용하는 것이 더 좋을 것이라고 생각했다. 각각. – Adrana

+0

내 응용 프로그램은 수만 개의 레코드를 처리하고 데이터를 적절한 클래스로 패키징하는 작업은 거의 시간이 걸리지 않습니다. – Sheridan

답변

1

정말 이상한 컨트롤에 맞서 이틀 동안 머리를 쓰다듬어 마침내 해결책을 찾았습니다. 실제로 나는 문제에 잘 부합 할 수있는 몇 가지 코드를 발견했으며, 나는 적절한 상황이 필요했습니다. 나는 바인딩 콤보와 함께 작동하는 방법 난 완벽하지 않았는지,하지만 여기 내 솔루션입니다 :

코드 숨김

Data data = new Data(); 
this.DataContext = data; 
this.gridCameras.ItemsSource = data.dataSetCameras.Tables[0].DefaultView; 

XAML :

<DataGridTemplateColumn Header="Cameras"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding reference}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.dataSetCameras.Tables[0].DefaultView}" 
         SelectedItem="{Binding article}" 
         SelectedValue="reference" 
         DisplayMemberPath="reference"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

'참조'필드의입니다 이름을 DataSet의 테이블에 저장하고 'article'은 바인딩 할 테이블의 이름을 지정합니다.

나는 UserControl에 있기 때문에 여전히 'AncestorType = {x : Type Window}'와 함께 작동하는 이유를 모르지만 "{Binding something}"대신 "something" "속성 또는"Path = "와"{Binding} "의 실제 차이점은 무엇입니까?하지만"DataContext.dataSet "은"dataSet "만 작동하지 않는 것처럼 결과를 가져올 수 있다고 생각합니다. .

어쨌든 몇 가지 테스트를 수행했는데 내 케이스 (400 개가 넘는 참조)의 ObservableCollection보다 DataSet을 사용하는 것이 훨씬 빠르지 만 더 가벼워졌습니다.

다른 사람들에게 도움이되기를 바랍니다.