2011-08-09 2 views
1

외부 관계가있는 일부 셀에는 일부 ComboBoxes가 포함 된 WPF DataGrid가 있습니다. 그러나 이는 수백 개의 ComboBoxes가 있음을 의미합니다. 너무 오래 걸리는 시간에로드됩니다. 우리가하고 싶은 것은 ComboBox가로드 될 때까지 레이블을로드하는 것입니다. 우리는 TextBox를 사용하여 쉽게이 작업을 수행 할 수 있습니다.DataView가있는 WPF DataGrid에서 클릭 할 때까지 ComboBox를 레이블로 표시하려는 경우

Google의 콤보 상자가 작동하고 사용자가 여러 표시 값 (예 : {Car, Dog, Cat}) 중에서 선택하여 열의 외래 키 값을 변경할 수 있습니다. 그러나 사용자가 라벨을 클릭하기 전에 레이블에 외래 키 값이 표시됩니다 (예 : {1, 2, 3}).

우리가 할 수있는 것에 대한 아이디어가 있습니까? 어떤 도움을 가장 높이 평가!

<DataGridTemplateColumn Header="Column Name" SortMemberPath="Column Name"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=DataViewBehindColumnName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox 
      DataContext="{DynamicResource ResourceKey=ViewModel}" 
      ItemsSource="{Binding Path=ReferenceTableName, 
         Converter={StaticResource dataViewToListConverter}}" 
      DisplayMemberPath="ReferenceTableDisplayNamesColumn" 
      SelectedValuePath="ReferenceTablePrimaryKeyColumn" 
      SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, 
          Path=Item[DataViewBehindColumnName]}" 
      /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

종류의 안부 복어

답변

1

라인 당 뷰 모델을 만들고에서 해결 된 문자열 값과 키를 나타내는 또 다른 속성을 나타내는 속성이 제공합니다. Content-property 레이블을 string-property에, combobox SelectedValue를 key-property에 바인드하십시오.

MVVM 말하기 : 문제가있는 속성의 해결 된 문자열 값을 포함하여 DataGrid에 필요한 모든 속성을 포함하는 라인 항목 래퍼를 만듭니다. 내가 귀하의 게시물

1) 데이터 그리드 가상화를 읽을 때

+0

이렇게하면 모든 외부 관계에 구현할 필요가없는 방법이 있습니까? 우리는 테이블 당 15 개의 외래 키를 가정합니다 ... 우리는 응용 프로그램에서 40 개의 테이블을 편집 할 수있게하려고합니다 - 유지 관리의 악몽입니까? – Fugu

+0

@ Fugu : 나는이 질문에 답하기에 충분한 정보가 없습니다. 나는 몇몇 OR-Wrapper가 당신을 위해 그런 일을 할 수 있다고 생각합니다. 필자의 경우 필자는 필기 도구를 사용하여 그러한 뷰 모델을 생성합니다. OR 매퍼의 문맥에 질문을 올리면 답변을 얻을 수 있습니다. 하나만 사용하고 데이터베이스 나 다른 소스에 직접 액세스하는 경우 추상적 수준에서 해결을 수행하는 도우미 클래스에 대해 생각하십시오. – HCL

+0

많은 감사. 우리는 객체 관계형을 수행하지 않습니다. 일부 데이터 제출 요구 사항으로 인해 DataSet이 뒤에 있고 컨트롤을 바인딩 할 DataView가 있습니다. DataView 필터를 변경하는 명령입니다. DataView 대신 목록이 필요한 컨트롤 용 변환기. – Fugu

0

내 마음에 오는 두 가지가있다. 이렇게하면 약간의 부하를 줄일 수 있습니다.

2a) bool 속성 "ShowData"를 사용하여 DataObject의 프록시를 빌드하십시오. 기본적으로 false이며 컨트롤을 클릭하면 true로 설정됩니다. 당신은 commandBinding으로 그렇게 할 수 있습니다. ORM을 사용하지 않는 경우 DataSet SourceCode를 확장하고이 기능을 추가 할 수 있습니다. 그러나 이것은 일의 sh * tload를 끝낼 수 있었다.

2b) 콤보 상자에는 편집 가능한 템플리트와 비 편집 템플리트가 있습니다 (블렌드에서 쉽게 찾을 수 있음). 편집 불가능 템플리트의 내용을 바인드하여 정적 문자열과 편집 가능한 템플리트를 관계에 표시하십시오. 그러면 selectedItem을 편집하려고 할 때만 관계가 표시됩니다. 다시 말하지만, NHibernate와 같은 ORM을 사용하면 LazyLoading 기능으로 이익을 얻을 수 있습니다.