2011-05-14 7 views
0

WPF에서 데이터 바인딩을 사용하여 개체 소스의 데이터로 ListBox를 채우려고합니다.ListBox에 계층 적 개체 데이터 바인딩

소스는 xml 파일에서 데이터가로드되는 ObjectDataProvider입니다. XML 파일을 읽고 적절한 데이터 구조를 채운 다음 ObjectDataProvider의 ObjectInstance를 데이터 구조로 설정합니다. 여기

데이터 구조이다

Public 클래스 소자 { 공개 진수 myValue;

public decimal df_myValue { get { return myValue; } set { this.myValue = value; } } 

}

공용 클래스 BasicSet { 공개 요소 [] ELEMENTSET;

public Element[] df_elementSet { get { return elementSet; } set { this.elementSet = value; } } 

}

공용 클래스 데이터 세트 { 공개 BasicSet [] basicSet;

private DataSet m_dataSet; 
    private ObjectDataProvider mODP; 

    public void LoadXml(EditorContext context, XmlValidator.Context validator, XmlDocument doc) 
    { 
     mODP = FindResource("TheData") as ObjectDataProvider; 

     XmlSerializer xs = new XmlSerializer(typeof(DataSet)); 
     XmlReader r = new XmlNodeReader(doc.DocumentElement); 
     m_dataSet = (DataSet)xs.Deserialize(r); 

     mODP.ObjectInstance = m_dataSet; 
    } 

원하는 결과이다 : 여기

<UserControl.Resources> 
    <ResourceDictionary> 
     <ObjectDataProvider x:Key="TheData" /> 

     <DataTemplate x:Key="ElementTemplate"> 
      <StackPanel> 
       <TextBox Text="{Binding, Path=df_myValue}" /> 
      </StackPanel> 
     </DataTemplate> 

     <HierarchicalDataTemplate x:Key="ElementSetTemplate" ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}"> 
     </HierarchicalDataTemplate> 

    </ResourceDictionary> 
</UserControl.Resources> 

<Grid> 
    <ListBox ItemsSource="{StaticResource TheData}" ItemTemplate="{StaticResource ElementSetTemplate}"> 
    </ListBox> 
</Grid> 

코드 숨김 XML 데이터가로드된다 :

public BasicSet[] df_basicSet { get { return basicSet; } set { this.basicSet = value; } } 

} 여기

는 XAML이고 ListBox에는 데이터 구조의 각 요소에 대한 TextBox가 있습니다. 이유는 데이터 구조가 계층 적이라는 점입니다. 나는 문제를 단순화하기 위해 데이터 구조를 평평하게 할 수 없다.

XML 데이터가 데이터 구조에 올바르게로드되는 것은 확실합니다. 중단 점을 배치하고 체크하고 모든 데이터가 잘 보일 수 있기 때문입니다. 그러나 프로그램을 실행하면 ListBox에 아무 것도 나타나지 않습니다.

도움을 주시면 감사하겠습니다.

답변

3

나는 잘못하고있는 것을 알아 냈습니다. 몇 가지 문제가있었습니다. 여기에 주요 포인트입니다 : 내가 ItemsControl을 사용하고있다한다

1)

2) 나는 내가 필요) 컨트롤의 세 가지 수준을

3 HierarchicalDataTemplate을 사용하지 않았다 : 내부 텍스트 상자를 itemsControl 내의 itemsControl ...이 작업은 두 개의 DataTemplates를 사용하여 수행 할 수 있습니다. 최상위 itemsControl은 내부 itemsControl을 보유하는 DataTemplate을 나타냅니다. 그런 다음 itemsControl은 내부 TextBox를 보유하는 DataTemplate을 참조합니다. 이 다른 사람 도움

<UserControl.Resources> 
    <ResourceDictionary> 
     <ObjectDataProvider x:Key="TheData" /> 

     <DataTemplate x:Key="ElementTemplate"> 
      <TextBox Text="{Binding Path=df_myValue}"/> 
     </DataTemplate> 

     <DataTemplate x:Key="ElementSetTemplate"> 
      <GroupBox Header="I am a GroupBox"> 
       <ItemsControl ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </GroupBox> 
     </DataTemplate> 

    </ResourceDictionary> 
</UserControl.Resources> 

<Grid> 
    <ItemsControl ItemsSource="{Binding Source={StaticResource TheData}, Path=df_basicSet}" ItemTemplate="{StaticResource ElementSetTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

희망 ... 후속에 대한

내가 찾던 그냥 어떤
+0

, 감사 : 여기

그리고

올바른 XAML입니다. –

관련 문제