2015-06-05 54 views
0

我有一個樹狀視圖,其中有可選項目,其中可能會觸發某些代碼操作的子項目。當子項目被點擊時,該動作應該被執行,但是父項目必須保持/成爲選擇的項目。WPF在樹狀視圖中操縱選定的項目

我面臨的問題是該項目沒有被正確取消選擇,導致在樹視圖中選擇多個項目。

下面是樹視圖中的XAML:

<TreeView Name="Treeview1" Style="{StaticResource vcc_Treeview}" > 
     <TreeView.ItemTemplate > 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}" > 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding ImgSrc}" Style="{StaticResource vcc_TreeviewItemImage}" /> 
        <TextBlock Text="{Binding Description}" Style="{StaticResource vcc_TreeviewItemTextblock}" Foreground="{Binding TextColorBrush}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay, Converter={StaticResource clsBindingDebugger}}" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 

的clsBindingDebugger什麼也不做,但調試打印轉換後的值,並通過型轉換和convertback值。

接下來的樹型視圖類

Public Class MyTreeviewItem 
Implements INotifyPropertyChanged 

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

Public Event MyTreeviewItem_ExpandedChanged(MTI As MyTreeviewItem, IsExpanded As Boolean) 
Public Event MyTreeviewItem_SelectedChanged(MTI As MyTreeviewItem, IsSelected As Boolean) 



Public Sub New(Optional Level_ As Integer = 1, Optional ByVal Key_ As String = "") 
    MyBase.New() 
    Me.Children = New ObservableCollection(Of MyTreeviewItem) 
    _Key = Key_ 
    _Level = Level_ 
End Sub 

Private _Level As Integer 
Public Property Level As Integer 
    Get 
     Level = _Level 
    End Get 
    Set(value As Integer) 
     _Level = value 
    End Set 
End Property 

Private _Descr As String = "" 
Public Property Description As String 
    Get 
     Description = _Descr 
    End Get 
    Set(value As String) 
     _Descr = value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Description")) 
    End Set 
End Property 

Private _Key As String = "" 
Public Property Key As String 
    Get 
     Key = _Key 
    End Get 
    Set(value As String) 
     _Key = value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Key")) 
    End Set 
End Property 

Private _ImgSrc As ImageSource 
Public Property ImgSrc As ImageSource 
    Get 
     ImgSrc = _ImgSrc 
    End Get 
    Set(value As ImageSource) 
     _ImgSrc = value 
    End Set 
End Property 

Private _Children As ObservableCollection(Of MyTreeviewItem) 
Public Property Children As ObservableCollection(Of MyTreeviewItem) 
    Get 
     Return _Children 
    End Get 
    Set(value As ObservableCollection(Of MyTreeviewItem)) 
     _Children = value 
    End Set 
End Property 

Private _IsSelected As Boolean 
Overloads Property IsSelected As Boolean 
    Get 
     Return _IsSelected 
    End Get 
    Set(ByVal value As Boolean) 
     _IsSelected = value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("IsSelected")) 
     RaiseEvent MyTreeviewItem_SelectedChanged(Me, _IsSelected) 
    End Set 
End Property 

Private _IsActionItem As Boolean 
Overloads Property IsActionItem As Boolean 
    Get 
     Return _IsActionItem 
    End Get 
    Set(ByVal value As Boolean) 
     _IsActionItem = value 
    End Set 
End Property 
End Class 

稍短的版本,最後我觸發事件MyTreeviewItem_SelectedChanged:

​​

假設樹視圖的樣子:

item 1 
--Action 1 
--Action 2 
Item 2 
--Action 3 
--Action 4 

在我出發情況項目2被選中。現在我單擊操作1,所以應該執行操作,之後項目1應該是選定的項目。 的debug.print結果在這些行:

ConvertBack: False 
Item 2 Selected = False 
Convert: False 
ConvertBack: True 
Action 2 Selected = True 
Action 2 Selected = False 
Convert: True 
Item 1 Selected = True 
Convert: False 

此時項1被選擇,因爲它應該是。 現在我單擊操作3.

ConvertBack: False 
Action 2 Selected = False 
Convert: False 
ConvertBack: True 
Action 3 Selected = True 
Action 3 Selected = False 
Convert: True 
Item 2 Selected = True 
Convert: False 

其結果是,第1項和第2項均選擇,其中只有2項應選擇。第二個調試器塊顯示「Action 2 Selected = False」,這應該是「Item 1 Selected = False」

我希望我很清楚。任何人都可以指點我解決我的問題嗎? 謝謝!

回答

0

對於誰有興趣...

我stille不太明白爲什麼代碼無法正常工作。但顯然,點擊的行動項目沒有被正確取消。而不是調用這些行:

ReselectingParent = True 'to prevent this sub from being executed with the next 2 lines 
    MTI.IsSelected = False 
    MTI.Parent.IsSelected = True 
    ReselectingParent = False 

直接在MyTreeviewItem_SelectedChanged我現在調用一個計時器。在timer_elapsed事件中,我打電話給四條線。 顯然調用代碼來選擇它的父項時,操作項的主要選擇並未完成。這是一個醜陋的解決方法,但它適用於我...