Object databinding으로 WPF TreeView를 만드는 데 심각한 문제가 있습니다.TreeView가 객체 계층 구조를 표시하지 않습니다.
응용 프로그램은 설정 파일 편집기입니다. 올바른 XML 형식으로 serialize 할 수있는 Object 구조를 정의했습니다.
문제는 올바른 계층 구조를 보여주는 TreeView에서 개체 인스턴스의 서식을 지정하는 것입니다. TreeView는 Channel 노드 만 렌더링하고 다른 것은 렌더링하지 않습니다. Channel
의
public class Objects
{
public List<Channel> Channels { get; set; }
}
public class Channel
{
public string Id { get; set; }
public string Name { get; set; }
public Reader Reader { get; set; }
public Filters Filters { get; set; }
public Router Router { get; set; }
public Persister Persister { get; set; }
}
public class Filters : ArrayList
{
public string StopOnFailure { get; set; }
}
public class Reader
{
public string Id { get; set; }
public string Name { get; set; }
}
모든 자식 클래스 속성을 Id
및 Name
이 포함되어 있습니다. Filters 클래스는 동일한 속성 정의가있는 다른 유형의 컬렉션입니다.
다음은 XAML
<Window.Resources>
<ObjectDataProvider x:Key="data"/>
<DataTemplate DataType="{x:Type ConfigurationEditor:Channel}">
<WrapPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}" />
<TextBlock Text=" [" />
<TextBlock Text="{Binding Path=Id}" />
<TextBlock Text="]" />
</WrapPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type ConfigurationEditor:Reader}">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<TreeView Margin="12,12,12,96" Name="treeView1" ItemsSource="{Binding Source={StaticResource data}, Path=Channels}">
</TreeView>
</Grid>
인 코드 뒤에 데이터 인스턴스
Objects config;
var serializer = new XmlSerializer(typeof(Objects));
using (var stream = new FileStream(@"C:\test.xml", FileMode.Open))
{
config = (Objects)serializer.Deserialize(stream);
}
var dp = (ObjectDataProvider)FindResource("data");
dp.ObjectInstance = config;
내가 셀 수없이 많은 사례 검토 한하지만 난 아직도 내가 뭘 잘못 알아낼 수를 만듭니다. 도와 주셔서 감사합니다.
업데이트 :
<HierarchicalDataTemplate DataType="{x:Type ConfigurationEditor:Objects}" ItemsSource="{Binding Path=Channels}"/>
<HierarchicalDataTemplate DataType="{x:Type ConfigurationEditor:Channel}" ItemsSource="Binding Path=Reader}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type ConfigurationEditor:Reader}">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
TreeView
에 변화 없음. 이 변경으로 나는 여전히 Channel
만 나열하고 그 밖의 것은 없습니다.
Nitpicking 조금 있지만 게시물에서 "WCF"텍스트를 "WPF"로 바꾸십시오. WCF와 WPF는 별도의 기술입니다. –
@David : 혼란을 피하기 위해 그것을 고쳤습니다. – Andy