2010-03-11 2 views
3

저는 WPF가 새로 도입되었습니다. L2S을 사용하여 SQL 데이터베이스의 데이터를 표시하는 페이지가 있습니다. L2S은 특정 영역에 대해 선택할 수있는 모든 옵션을 포함하는 DataTable을 반환합니다. DataBase에서 반환하는 모든 행은 checkbox이어야하며 해당 확인란을 stackpanel에 넣고 싶습니다.StackPanel에 데이터베이스의 체크 박스를 채 웁니다.

나는 데이터 바인딩을 StackPanel으로보고 있습니까? 그 느낌이 잘못되었습니다 ... 나는 DataTable을 통해 반복하고 각 행에 대한 확인란 항목을 만든 다음 런타임에 StackPanel에 추가해야한다고 생각했습니다. 이 올바른지? 내 문제의 DataTable 일부를 반환하고 있습니까?

나는 StackPanelDataContext 속성이 있지만 각각의 항목을 checkbox으로 수정하는 것을 알지 못하기 때문에 설정할 수는 없습니다.

답변

8

ItemsControl이 필요할 수 있습니다. 이렇게하면 지정된 DataTemplate을 사용하여 일련의 항목을 표시 할 수 있습니다. 당신은 ItemsControl에이 인라인 할 수 있습니다 :

<ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

또는 리소스에서 명시 적으로 데이터 템플릿을 참조 ... 뭔가 더 같은 :

<!-- In some parent resource section --> 
    <DataTemplate x:Key="MyDataTemplateName"> 
     <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
    </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}"> 
    </ItemsControl> 

또는 당신은 모양을 정의하는 DataTemplate을 정의 할 수 있습니다 너의 바운드 수업을 느낀다. 같은 뭔가를 (당신의 Linq에 - 투 - SQL은 익명 형식으로 돌출되어있는 경우,이 옵션은하지 않는다) :

 <!-- In some parent resource section --> 
     <DataTemplate DataType="{x:Type MyBoundClass}"> 
      <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
     </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
    </ItemsControl> 

WPF 다음 각 항목의 데이터 형식과 일치하는 DataTemplate을 찾습니다 귀하의 컬렉션에. 이것은 다른 프리젠 테이션이 필요한 이기종 컬렉션을 바인딩하는 데 매우 유용 할 수 있습니다.

당신은 Stackpanel의 DataContext를 바인딩 할 수 있지만 데이터의 각 요소에 대한 템플릿을 반복하는 것에 대한 고유 한 논리는 없습니다. 단순히 자식 컨트롤에 대한 컨텍스트를 제공하고 {Binding ...} 문을 포함합니다. 반복 데이터를 처리하는 모든 컨트롤은 ItemsControl의 하위 항목이며 ItemsSource 속성을 통해 데이터를 가져옵니다.

+0

+1 좋고 철저한 답변입니다. –

3

Ben Von Handorf의 답변 외에도 ItemsControl이 ItemsPanel을 변경하여 해당 요소를 정렬하는 방식을 변경할 수도 있다는 점을 알아두면 유용 할 거라고 생각했습니다. 예 :

<ListBox ItemsSource="{Binding MyCollection}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

이렇게하면 ListBox는 항목을 세로로 정렬하지 않고 가로로 정렬합니다. 항목이 텍스트처럼 "흐르게"하려면 WrapPanel을 사용할 수도 있습니다 (html을 알고있는 경우 span). WrapPanel은 가로 또는 세로 방향 일 수도 있습니다. (그러나 WrapPanel은 가상화가 아니기 때문에 많은 수의 항목에 사용하지 마십시오. 큰 지연이 발생합니다.)

사용자 지정 패널을 만들어 대신 사용할 수 있습니다. 한 번은 무작위로 항목을 배치 한 패널을 만들어 ListBox에 사용했습니다. 내 바운드 컬렉션의 각 항목은 ListBox 내의 임의의 위치에 표시되었습니다. 레이아웃이 새로 고침 될 때마다 항목의 위치가 새로 지정됩니다.

+1

우수한 점 ... 나는 그것을 다루었어야했다. 내 구멍을 채워 줘서 고마워. :) –

관련 문제