2013-05-31 42 views
2

我使用的代碼來自此處:WPF/MVVM - how to handle double-click on TreeViewItems in the ViewModel?,來自接受的答案。我的XAML是這樣的:從風格標籤將命令附加到樹視圖的兒童 - 對於嵌套的兒童不同

<TreeView CommandBehaviors:MouseDoubleClick.Command="{Binding ConnectServer}" CommandBehaviors:MouseDoubleClick.CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}" 
            Grid.Column="0" HorizontalAlignment="Stretch" DockPanel.Dock="Left" ItemsSource="{Binding Path=ServerItems, UpdateSourceTrigger=PropertyChanged}"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="CommandBehaviors:MouseDoubleClick.Command" Value="{Binding ConnectDb}"/> 
      <Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Databases}"> 
      <TextBlock Text="{Binding}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

附加命令不起作用,它should't,因爲已經有安裝在TreeView的標籤級別的命令。我想要做的是爲頂級兒童執行一個命令,另一個爲較低級別的兒童執行。我怎麼做?

編輯:

所以,薇薇建議 - 我該如何檢查,如果樹型視圖是一個根節點?

+0

從「TreeView」中刪除附加的屬性,並添加一個'Style.Trigger'來檢查當前的'TreeViewItem'是否是根,並相應地將附加屬性應用到你目前在'TreeView'中實現的內容。 – Viv

+0

不知道如何做到這一點,請給我一些示例代碼?你可以發表一個答案,如果它的工作,我會接受它。 –

+0

我的意思是 - 檢查它是這樣的:''不起作用=沒有IsRootNode屬性,所以我應該自己寫嗎? –

回答

2

類似:

<Window.Resources> 
    <CommandBehaviors:IsRootNodeConverter x:Key="IsRootNodeConverter" /> 
</Window.Resources> 
<Grid> 
    <TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="CommandBehaviors:MouseDoubleClick.Command" 
       Value="{Binding ConnectDb}" /> 
     <Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" 
       Value="{Binding Path=SelectedItem, 
           RelativeSource={RelativeSource Self}}" /> 
     <Setter Property="Foreground" 
       Value="Black" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=., 
              RelativeSource={RelativeSource Self}, 
              Converter={StaticResource IsRootNodeConverter}}" 
         Value="True"> 
      <Setter Property="CommandBehaviors:MouseDoubleClick.Command" 
        Value="{Binding ConnectServer}" /> 
      <Setter Property="Foreground" 
        Value="Tomato" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate> 
     <!--<TreeViewItem>--> 
      <TextBlock Text="{Binding}" /> 
     <!--</TreeViewItem>--> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
    <TreeViewItem Header="1"> 
     <TreeViewItem Header="A" /> 
     <TreeViewItem Header="B"> 
     <TreeViewItem Header="AA" /> 
     <TreeViewItem Header="AB" /> 
     <TreeViewItem Header="AC" /> 
     </TreeViewItem> 
     <TreeViewItem Header="C" /> 
    </TreeViewItem> 
    </TreeView> 
</Grid> 

和轉換器:

class IsRootNodeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    TreeViewItem item = value as TreeViewItem; 
    if (item == null || item.Parent == null) 
     return false; 
    return !Object.ReferenceEquals(value.GetType(), item.Parent.GetType()); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 

我故意從StyleTrigger,因爲它似乎並沒有從默認的改變留出了CommandBehaviors:MouseDoubleClick.CommandParameter。剛剛添加了Foreground屬性進行測試,您也可以刪除它。

+0

我無法得到這個工作(不僅命令不運行,但即使前景屬性沒有設置) - 也許這是因爲我的項目被動態添加? –

+0

適合我。你可以告訴我你的測試嗎? http://chat.stackoverflow.com/rooms/30994/wpf-treeview-bugfix – Viv