2011-02-01 13 views
8

我有wpf TreeView - 綁定到一些數據。 樹視圖位於窗口的左側,分爲兩個區域,樹是導航區,右側的面板根據所選的樹節點更改內容。如何防止根據條件選擇TreeViewItem

並非樹視圖的所有節點都會生成詳細信息。 我想禁用這些節點的選擇。任何想法?

感謝

+2

爲什麼在選擇這些節點時不顯示「無可用詳細信息」等消息?使它們不可選擇它與TreeView的功能不太一致。如果用戶點擊一個節點並且該節點沒有被選中,他的第一個想法就是點擊丟失了(沒有視覺反饋)。更不用說更容易實現了。 – 2011-02-01 23:19:33

回答

6

你有這樣的事情在你的源布爾屬性稱爲HasDetails什麼?在這種情況下,你可以使用這樣的東西。在ItemContainerStyle中創建一個MultiDataTrigger,它綁定到DataContext中的HasDetailsIsSelected中的TreeViewItem,如果兩者均爲True(當然,True表示HasDetails爲False :-),則啓動一個Storyboard,取消選擇新選擇的TreeViewItem

這將禁用選擇所有TreeViewItem的沒有細節,但他們仍然是可擴展的。希望這是你要找的

<TreeView ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding HasDetails}" Value="False"/> 
         <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames BeginTime="00:00:00" 
                   Storyboard.TargetProperty="(TreeViewItem.IsSelected)"> 
            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </MultiDataTrigger.EnterActions> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

更新

要禁用TreeViewItem的地方HasDetails是假,你可以使用這個

<TreeView ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsEnabled" Value="{Binding HasDetails}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

謝謝Meleak。它工作得很好,但是我失去了最後一個節點的選擇亮點。任何想法? – jama64 2011-02-01 22:19:01

18

@ jama64:你能達到什麼如果將樣式從屬性IsEnabled更改爲可聚焦,則需要。

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Focusable" Value="{Binding HasDetails}"/> 
    </Style> 
</TreeView.ItemContainerStyle>