2010-08-24 90 views
3

所以我遇到了TreeView的問題。如果我靜態地構建樹視圖,樹中的每個節點都是可選的,因爲當我點擊它時,它會將自身突出顯示爲藍色,表示該節點已被選中。WPF/XAML TreeView在綁定後並不高亮節點

<TreeView 
    Grid.Column="0" 
    Grid.Row="2" 
    MinHeight="100" 
    MinWidth="100" 
    BorderBrush="White" 
    DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}"> 
<TreeViewItem Header="Project 1" IsExpanded="True"> 
    <TreeViewItem Header="Step 1" IsExpanded="True"> 
     <TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem> 
     <TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem> 
    </TreeViewItem> 
    <TreeViewItem Header="Step 2" IsExpanded="True"> 
     <TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem> 
     <TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem> 
    </TreeViewItem> 
</TreeViewItem> 

不過,我綁定到TreeView來填充它。此外,我綁定到實現Emiel Jongerius's BindableObjectBase3 class的對象。這是一個非常棒的基類實現,它允許我的對象成爲Bindable並實現INotifyPropertyChanged接口,同時關注手動DependencyProperty管理。

所以這是我試圖在TreeView中實現的基本類結構(從我的實際對象簡化)。

public abstract class MyCustomClass : BindableObjectBase3 
{ 
    private string m_strName; 

    public virtual string Name 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Name)) 
      { 
       return m_strName; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_strName, value,() => this.Name); 
     } 
    } 
} 

public class Project : MyCustomClass 
{ 
    private List<Step> m_steps; 

    public List<Step> Steps 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Steps)) 
      { 
       return m_steps; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_steps, value,() => this.Steps); 
     } 
    } 
} 

public class Step : MyCustomClass 
{ 
    private List<Load> m_loads; 

    public List<Load> Loads 
    { 
     get 
     { 
      using (this.GetPropertyTracker(() => this.Loads)) 
      { 
       return m_loads; 
      } 
     } 
     set 
     { 
      this.SetValue(ref this.m_loads, value,() => this.Steps); 
     } 
    } 
} 

public class Load : MyCustomClass 
{ 
} 

這是基本的XAML我用它來實現的TreeView:

<TreeView 
    Grid.Column="0" 
    Grid.Row="2" 
    MinHeight="100" 
    MinWidth="100" 
    BorderBrush="White" 
    DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate x:Key="LoadTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="StepTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}" IsExpanded="True" 
        ItemsSource="{Binding Path=Loads}" 
        ItemTemplate="{StaticResource LoadTemplate}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="ProjectTemplate"> 
      <TreeViewItem Header="{Binding Path=Name}" IsExpanded="True" 
        ItemsSource="{Binding Path=Steps}" 
        ItemTemplate="{StaticResource StepTemplate}"> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
    <TreeViewItem 
      Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}" 
      ItemsSource="{Binding}" 
      IsExpanded="True" 
      Focusable="True" 
      ItemTemplate="{StaticResource ProjectTemplate}"> 
    </TreeViewItem> 
</TreeView> 

現在,這一切工作正常,儘可能結合去。我可以綁定到一個ObservableCollection <項目>和當我添加/刪除/操作項目,樹視圖相應地更新。

但是,TreeView中唯一可以選擇的節點是第一個節點(靜態的節點)。通過動態綁定創建的所有其他節點並不表示它們在GUI上被選中。我希望他們點擊時也會突出顯示藍色。但相反,他們什麼都不做。有沒有人有一個想法,爲什麼?

+0

我不相信之前沒有人遇到過這個問題? – Ristogod 2010-08-24 16:02:16

回答

4

您不應該在您的ItemTemplates中明確定義TreeViewItems。您無法選擇任何項目的原因是,它們沒有父級TreeView來控制選擇行爲。您需要讓TreeView爲您生成TreeViewItem控件,並僅使用項目模板來爲Headers和其項目的綁定定義UI。使用類似這樣的代替:

<Window.Resources> 
    <HierarchicalDataTemplate x:Key="LoadTemplate"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="StepTemplate" ItemsSource="{Binding Loads}" ItemTemplate="{StaticResource LoadTemplate}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="ProjectTemplate" ItemsSource="{Binding Steps}" ItemTemplate="{StaticResource StepTemplate}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<TreeView MinHeight="100" MinWidth="100" BorderBrush="White" 
      ItemsSource="{Binding Path=Projects}" 
      ItemTemplate="{StaticResource ProjectTemplate}"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

非常感謝。如此多的搞清楚這種控制似乎不直觀。我很高興你能分享你的經驗。謝謝。 – Ristogod 2010-08-25 13:21:55

1

我的TreeView的行爲與原始海報描述的一樣。我可以選擇我的TreeView控件中的所有東西,但是如果我選擇了一個父節點,那麼父節點即使是綁定並單擊子節點也是亮點。我嘗試構建我的代碼以類似John Bowen的建議,並且仍然得到相同的結果。這是我的XAML代碼:

<Fluent:RibbonWindow.Resources> 
     <HierarchicalDataTemplate x:Key="MyTreeViewStyle" ItemsSource="{Binding Contacts}"> 
      <!-- Display the Index by showing it's Index string --> 
      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="img" Width="16" Height="16" Stretch="Fill" Source="Images\closedfolder16.png" /> 
       <TextBlock Text="{Binding Index}" Margin="5,0" ToolTip="{Binding Index}"/> 
      </StackPanel> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Image x:Name="img2" Width="16" Height="16" Stretch="Fill" Source="Images\closedfolder16.png" /> 
         <TextBlock Text="{Binding Name}" Margin="5,0" ToolTip="{Binding Name}"/> 
        </StackPanel> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
</Fluent:RibbonWindow.Resources> 

然後我在TreeView控件在這裏使用它:

   <Grid> 
        <TreeView Margin="2,2,2,2" x:Name="MyTreeView" ItemTemplate="{StaticResource MyTreeViewStyle}" ItemContainerStyle="{StaticResource AlwaysExpand}" ScrollViewer.CanContentScroll="True" BorderThickness="0" TreeViewItem.Selected="btnDisplayContact_Click" />      
       </Grid> 

結果是這樣的截圖,請注意父節點d是如何點擊子節點後強調,而不是子節點被強調:

http://home.swbell.net/davis32/Snapshot.png

不能發佈圖片所以只是剪切和粘貼的URL鏈接。