2012-08-31 2 views
0

저는 간단한 트리 구조를 Win 8 (이전 명칭) Metro 앱의 ItemsControl의 itemsSource에 바인드하려고합니다. 내 구조체가 INotifyPropertyChanged 인터페이스를 구현하고 자식 중 하나가 변경되면이를 알립니다.ItemsControl의 ItemsSource로서의 트리 구조

내 나무를 ObservableCollection에 평평하게 만드는 변환기를 만들려고했지만 바인딩을 만든 후에 새로 고치지 않았습니다.

나는 내가 좋아하는 것이 무엇인지 보여주기 위해 다음 테스트 프로젝트를 만든 : 당신이 바닥 응용 프로그램 표시 줄에 추가 버튼을 누르면, 그것은에 새로운 아이를 만들 수 있다는 https://skydrive.live.com/redir?resid=970FFC53F4B7A598!146

이 간단한 프로젝트의 문제, 계층 구조 있지만 ListView 새로 고치지 않습니다.

내가 누락되었거나 어떻게해야합니까?

답변

1

DataTemplate을 사용하면 상당히 간단합니다.

<DataTemplate DataType="{x:Type local:TreeItemType}"> 
    <StackPanel> 
     <ContentPresenter Content="{Binding Name}"/> 
     <ItemsControl ItemsSource="{Binding Children}"/> 
    <StackPanel> 
<DataTemplate> 

ItemsControl.Resources를 통해 암시 적으로 적용 (그래서 그것뿐만 아니라 내부 ItemsControl에 적용됩니다.


그냥 잎을 원하는 경우 또는 항목은 당신이 만들 수있는 하나의 단위 없다는 함께 문제를 가지고 CompositeCollection,보기 만 참조로 인해 수정되지 않은 ObservableCollection을 만드는 변환기가 아닌 경우 CollectionContainers을 통해 원본 컬렉션을 래핑하면 알림이 보존됩니다.

+0

CompositeCollection 및 CollectionContainers 솔루션을 사용하여 샘플을 게시 할 수 있습니까? –

+0

흠. WinRT에는 CompositeCollection 및 CollectionContainer 클래스가 없다고 가정합니다. 내 문제는, 내가 그것의 어린이의 사용자 정의 레이아웃을 만든 패널을 가지고있다. 그것은 ItemsControl과 함께 쉽게 사용되지만 위의 솔루션을 사용하여 계층 적 구조를 유지한다면 레이아웃을 만드는 방법을 모릅니다. –

+0

@adam_gav : 그건 불행한 일입니다. 물론 자신 만의 것을 구현할 수도 있습니다. 나는 변환기에 대한 문제를 충분히 설명했다고 생각한다. 원본 콜렉션에 대한 참조를 유지하고 그들의'CollectionChanged' 이벤트에 반응해야한다. 복합 컬렉션은 하위 컬렉션의 이벤트를 전달하는 것 이상을 수행하지 않습니다. –