Treeview IsExpanded未激活

时间:2016-01-27 08:21:56

标签: c# wpf mvvm treeview

我正在尝试向TreeView添加捕捉IsExpanded事件的能力。因此,当某个项目展开时,它将在视图模型上引发属性或命令。

这是我的代码:

  <TreeView  Name="ScenariosTreeView" ItemsSource="{Binding Path=Cat, Mode=TwoWay}" Focusable="True" >
     <TreeView.InputBindings>
       <KeyBinding Key="Delete" Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedValue ,ElementName=ScenariosTreeView}" />
     </TreeView.InputBindings>

     <TreeView.ItemContainerStyle>
       <Style TargetType="{x:Type TreeViewItem}">
         <Setter Property="IsExpanded" Value="{Binding IsExtended, Mode=TwoWay}" />
         <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
       </Style>
     </TreeView.ItemContainerStyle>

     <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type sotc:ScenarioCategory}" ItemsSource="{Binding Path=ScenarioList}" >
         <TextBlock  Text="{Binding Path=Name}" Foreground="Black" IsEnabled="True" Focusable="True"/>
       </HierarchicalDataTemplate>

       <DataTemplate DataType="{x:Type sotc:Scenario}" >
         <TextBlock  Text="{Binding Path=Name, Mode=TwoWay}" />
       </DataTemplate>
     </TreeView.Resources> 
  </TreeView>

我在IsExpanded的视图模型中也有一个属性(对于IsSelected),当我展开TreeviewItem时,没有任何属性。 任何想法?

非常感谢,

2 个答案:

答案 0 :(得分:1)

当节点扩展并且一切正常时,尝试重现问题并实现调用命令的附加行为。完整的解决方案代码:

<强> XAML

from bokeh.plotting import figure, output_file, show
from bokeh.models import LinearAxis, Range1d
import pandas as pd

output_file("bars.html")

df = pd.DataFrame()
df['y_att1'] = [0.70,0.68,0.50,0.48,0.30,0.28]
df['x_att1'] = ['b','d','a','h','f','e']

p = figure(title="twin y-axis bar example", x_range=df['x_att1'].values.tolist())

p.quad(bottom=0, top=df['y_att1'], left=df['x_att1'].values.tolist()
    , right=df['x_att1'].values.tolist(), line_width=7, line_color='red')

p.yaxis.axis_label = 'left y axis'
p.yaxis.axis_label_text_color = 'red'

#added these two lines
p.y_range.start = 0
p.y_range.end = df['y_att1'].max()*1.1

p.xaxis.axis_label = 'x axis'
p.xaxis.axis_label_standoff = -5

show(p)

<强> C#

<Window x:Class="TreeViewTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sotc="clr-namespace:TreeViewTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <sotc:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <TreeView  Name="ScenariosTreeView" ItemsSource="{Binding Path=Cat, Mode=TwoWay}" Focusable="True" >
            <TreeView.InputBindings>
                <KeyBinding Key="Delete" Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedValue ,ElementName=ScenariosTreeView}" />
            </TreeView.InputBindings>

            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExtended, Mode=TwoWay}" />
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                    <Setter Property="sotc:Behaviours.ExpandingBehaviour" Value="{Binding DataContext.ExpandingCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
                </Style>
            </TreeView.ItemContainerStyle>

            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type sotc:ScenarioCategory}" ItemsSource="{Binding Path=ScenarioList}" >
                    <TextBlock  Text="{Binding Path=Name}" Foreground="Black" IsEnabled="True" Focusable="True"/>
                </HierarchicalDataTemplate>

                <DataTemplate DataType="{x:Type sotc:Scenario}" >
                    <TextBlock  Text="{Binding Path=Name, Mode=TwoWay}" />
                </DataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>

答案 1 :(得分:0)

找到答案。如果将事件放置在表示为treeviewItem的对象中而不是视图模型中,则会触发该事件。