2009-02-03 5 views
10

나는 목록 상자를 가지고 있으며, 나는 나의 Foo 객체에있는 모음 모음을 반복하고 싶다.WPF에서 ListBoxItem을 올바르게 바인딩하는 방법은 무엇입니까?

<ListBox DataContext="{Binding Path=Foo.Bars}" > 
    <ListBox.Items> 
     <ListBoxItem> 
      <ContentControl DataContext="{Binding Path=.}" /> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 

이것은 사용하려는 데이터 형식입니다.

<DataTemplate DataType="{x:Type Bar}"> 
     <Label Content="hello stackoverflow" /> 
</DataTemplate> 

내가 훔쳐 경우

는 (-> 도구 스눕 사용하여 검사) 내 응용 프로그램을 내가 알 그 바의 단지 1 대신에 ContentControl을, 에 바인딩 된 전체 컬렉션.

컬렉션에 반복 처리가 잘되도록 올바르게 바인딩하려면 어떻게해야합니까?

답변

3

첫째는 Window 요소 (인텔리)에 네임 스페이스를 추가 : 다음

xmlns:local="clr-namespace:yourenamespace" 

XAML (Window.Resources에서 그것을 할 수있는 깨끗한 방법입니다) 다음

<Window.Resources> 

     <ObjectDataProvider x:Key="DataProvider" ObjectType="{x:Type local:Foo}"/> 

     <DataTemplate x:Key="Template" > 
      <TextBlock Text="{Binding Bar}"/> 
     </DataTemplate> 

    </Window.Resources> 

놓습니다 Listbox :

<ListBox DataContext="{Binding Source={StaticResource DataProvider}}" ItemsSource="{Binding Bars}" ItemTemplate="DynamicResource Template" /> 

그러나, d 코드 숨김 개체를 사용하는 경우 개체 내의 public 속성을 ObservableCollection<>으로 초기화하도록 생성자를 설정해야합니다 (XAML에 개체 인스턴스의 일부 제한 규칙이 있음).

+0

이것을 구현했지만 작동하지 않습니다. – Natrium

+1

질문에 오브젝트 코드를 입력하는 것이 좋습니다. 내 대답에 일부 구문 오류가 있었는데, 나는 그것을 수정 (리소스, Resouce, 잊어 버린 GridView, 내가 손으로 모든 입력 ...). – belaz

+0

실제로 ListBox를 사용하고 있습니다. 처음 ListView를 게시했지만 편집했습니다. – Natrium

8

DataTemplate을 설정하면 WPF가 모든 작업을 수행합니다. ItemsSource를 Bar 항목 목록으로 설정하고 Bar 항목에 대한 DataTemplate을 정의하십시오.

<ListBox ItemsSource="{Binding Path=Foo.Bars}"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type Bar}"> 
      <Label Content="hello stackoverflow" /> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

또한 <ListBox.ItemTemplate>를 사용하는 대신 <ListBox.Resources>

은 MSDN에서 Data Binding Overview를 참조하여 직접 ItemsTemplate을 설정할 수 있습니다.

+0

제공되는 링크가 죽어있는 것 같습니다. – Default

+0

@Default 예, 그 링크가 썩어서 죄송합니다. 죄송합니다. 그것은 단지 WPF에서 바인딩에 대해 이야기하는 기사였습니다. –

관련 문제