2009-09-15 66 views
24

所以顯然我做錯了什麼,但我似乎無法使用DataType屬性時使HierarchicalDataTemplate(甚至只是DataTemplate)工作。我創建了最短的WPF應用程序來演示問題。如何在WPF DataTemplate上使用DataType屬性?

XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <HierarchicalDataTemplate DataType="x:Type local:Foo"> 
      <TextBlock Text="I am a Foo" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="x:Type System:String"> 
      <TextBlock Text="I am a String" /> 
     </HierarchicalDataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TreeView Name="treeView1" ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

CODE:

namespace WpfApplication1 
{ 
    public class Foo 
    { 
     public string Name { get; set; } 
    } 

    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      var list = new List<object> { "a", 1, "b", 2, new Foo() { Name="Brian"}}; 
      treeView1.DataContext = list; 
     } 
    } 
} 

很顯然,我希望它顯示在TreeView以下。

I am a string 
1 
I am a string 
2 
I am a foo 

但我的應用程序實際上顯示以下內容。

a 
1 
b 
2 
WpfApplication1.Foo 

奇怪的是,我在網絡上看到幾乎每一個例子做這事(有輕微的變化),並沒有其他人似乎與它有一個問題。然而,我嘗試過無數種不同的重新佈置XAML的方式,似乎沒有任何幫助。我希望另一雙眼睛可以幫助。

回答

35

你的代碼是好的,但你的數據類型的屬性值需要包裝在大括號:如果你不是全光照

<HierarchicalDataTemplate DataType="{x:Type local:Foo}"> 
    <TextBlock Text="I am a Foo" /> 
</HierarchicalDataTemplate> 
<HierarchicalDataTemplate DataType="{x:Type System:String}"> 
    <TextBlock Text="I am a String" /> 
</HierarchicalDataTemplate> 
+4

哈哈......那太尷尬了。有100%沒有辦法,我告訴你們任何一個人,我花了多少時間在這方面工作:) – 2009-09-15 01:04:32

+0

我認爲你也可以用DataType =「local:Foo」(沒有x:Type或花括號) ,所以不要尷尬。這是一個容易犯的錯誤! – 2009-09-15 01:26:40

+12

@Brian,歡迎來到WPF學習曲線。你會遇到很多這些,不要讓他們讓你失望。 – user7116 2009-09-15 02:19:30

2

您還沒有指定TreeView的ItemTemplate屬性。這個屬性告訴DataTemplate中要使用的,在你的情況,你想指定你的資源定義的樹視圖:

<TreeView Name="treeView1" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource MyResourceItemTemplate}" /> 

但在你的情況,你可能真的想使用一個DataTemplateSelector實現應用到TreeView.ItemTemplateSelector屬性選擇基於該類型不同的模板來顯示...

+0

我是一個WPF新手,但我相信ItemTemplate是不需要使用數據類型匹配時,而不是x:鍵匹配。事實上,馬特的解決方案的工作原理必須如此。是的,DataTemplateSelector是我的下一個任務。雖然,我想這次我會有更好的運氣。謝謝你的時間。 – 2009-09-15 01:07:07

+1

如果設置正確,數據類型的DataTemplate可以自動應用於日期類型。 – Gqqnbig 2013-01-06 07:53:14

3

而且g HierarchicalDataTemplate的ItemsSource你可以使用DataTemplate來代替。

+0

是的,實際上,我在我的真實應用程序中使用了ItemsSource,但仍然不錯。 – 2009-09-15 02:29:55

相關問題