2016-11-17 80 views
1

My TreeView-Please Click here如何在TreeView中突出顯示TreeviewItem以顯示狀態?

這是我的樹型視圖。這裏我只執行內部子節點。我想顯示執行節點的狀態,例如:這裏的「Primary_details」有3個孩子。如果Tap_Diary正在執行,我想用樹中的綠色突出顯示該節點,然後突出顯示下一個節點。應該保留第一個節點的選擇。完成這3個節點後,整個主要細節應該突出顯示。執行完後,應該用綠色高亮顯示整個樹在status.If執行失敗特定節點應該在紅色colour.Could請你幫me.Following是我的代碼

<TreeView x:Name="treeViewSteps" Visibility="Hidden" HorizontalAlignment="Left" Grid.Column="1" 
     Height="230" VerticalAlignment="Top" Width="267" Margin="10,46,0,0" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
       ScrollViewer.VerticalScrollBarVisibility="Auto"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:WorkFlowScriptIDDataStore}" ItemsSource="{Binding Subcategories}"> 
       <TextBlock Text="{Binding Name}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsExpanded" Value="True" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.Background> 
      <ImageBrush/> 
     </TreeView.Background> 
    </TreeView>  

代碼

List<WorkFlowScriptIDDataStore> lst = new List<WorkFlowScriptIDDataStore>() { WorkFlowScriptIDDataList }; 
      treeViewSteps.ItemsSource = lst; 
public class WorkFlowScriptIDDataStore 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public string ParentId { get; set; } 
     public int Level { get; set; }            
     public List<WorkFlowScriptIDDataStore> Subcategories { get; set; } 
    } 
+0

爲了給你一個很好的答案,它可能會幫助我們,如果你有一個問題,如果你還沒有看過。 「如果itemxx正在執行」是什麼意思? – Mat

+0

我正在執行一個測試步驟 –

回答

1

你可以添加一個狀態財產對你的物品。然後只需在後面的代碼中更改項目的狀態。該視圖將根據每個項目的狀態更新顏色。在我的例子中,我使用了DataTrigger。您還必須實現INotifyPropertyChanged界面到您的物品類。我在我的ViewModelBase課上做過這個。我不提供這個類,因爲這是一個非常基本的MVVM模式。

主窗口

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     this.InitializeComponent(); 

     List<ItemViewModel> newList = new List<ItemViewModel>(); 


     newList.Add(new ItemViewModel() { Name = "foo", Status = Status.finished}); 
     newList.Add(new ItemViewModel() { Name = "foo1", Status = Status.waiting }); 
     newList.Add(new ItemViewModel() { Name = "foo2", Status = Status.executing }); 


     newList[1].Items.Add(new ItemViewModel() { Name = "subFoo", Status = Status.executing }); 
     newList[1].Items.Add(new ItemViewModel() { Name = "subFoo1", Status = Status.executing }); 

     DataContext = newList; 


    } 
} 

ItemViewModel

public class ItemViewModel :ViewModelBase 
{ 
    private ObservableCollection<ItemViewModel> _subItems = new ObservableCollection<ItemViewModel>(); 
    private string _name; 
    private Status _status; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      OnPropertyChanged(); 
     } 
    } 
    public Status Status 
    { 
     get 
     { 
      return _status; 
     } 
     set 
     { 
      _status = value; 
      OnPropertyChanged(); 
     } 
    } 

    public ObservableCollection<ItemViewModel> Items 
    { 
     get 
     { 
      return _subItems; 
     } 
    } 
} 

狀態枚舉

public enum Status 
{ 
    waiting, 
    executing, 
    finished 
} 

XAML:

<TreeView ItemsSource="{Binding}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:ItemViewModel}" 
             ItemsSource="{Binding Items}"> 
       <TextBlock Text="{Binding Name}" > 
        <TextBlock.Style> 
         <Style TargetType="TextBlock"> 
          <Setter Property="Background" 
            Value="Red" /> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Path=Status}" 
              Value="{x:Static local:Status.finished}"> 
            <Setter Property="Background" 
              Value="Lime" /> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding Path=Status}" 
              Value="{x:Static local:Status.waiting}"> 
            <Setter Property="Background" 
              Value="#A9A9A9" /> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding Path=Status}" 
              Value="{x:Static local:Status.executing}"> 
            <Setter Property="Background" 
              Value="#0099CC" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </TextBlock.Style></TextBlock> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

缺少什麼?

您不提供如何處理您的物品。但這裏是一個例子:

foreach (var item in items) 
{ 
    item.Status = Status.waiting; 
} 

foreach (var item in items) 
{ 
    item.DoSomeStuff(); 
    item.Status = Status.finished; 
} 
+0

感謝Mat.Its的工作 –

+1

所以你可能想接受答案?甚至給我一個upvote ;-) – Mat