通过TreeViewItem对象访问WPF Treeview选择的索引

时间:2010-11-15 23:52:37

标签: wpf treeview

我有一个使用DataTemplate的每个项目的复选框的树视图。

<TreeView ItemsSource="{Binding}">
<DataTemplate DataType="{x:Type local:MatchDataLeaf}">
    <Grid Margin="3">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="240"/>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="150"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="60"/>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0" Orientation="Horizontal">
            <CheckBox x:Name="selectCheckBtn" Grid.Column="0" IsChecked="True" Click="select_Click"
                      Tag="{Binding}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"/>
            <TextBlock Grid.Column="1" Margin="5,0,0,0" Text="{Binding Path=Name}" FontFamily="Arial" FontSize="12" FontWeight="Bold" Foreground="Black" VerticalAlignment="Center"/>
    </StackPanel>
 </Grid>
</DataTemplate>

在复选框点击事件中,我试图在主树的绑定列表中找出所选索引。我得到的最接近的是在CommandParameter中传递TreeViewItem对象,但我无法对它做任何事情。我能够使用:

进行父ItemsControl
ItemsControl parent = ItemsControl.ItemsControlFromItemContainer(selectedItem);
int s = parent.Items.IndexOf(selectedItem);

但是这里s = -1。

我的复选框上还有标记,其中包含底层对象。当然,我可以在我的列表中查找对象的查找,但似乎必须有一种更简单的方法来查找索引。

1 个答案:

答案 0 :(得分:0)

您正在获取的ItemsControl可能是StackPanel或Grid。您应该能够通过事件发送方访问Checkbox,并导航到TreeViewItem和TreeView并使用IndexOf

 private void CheckBox_Click(object sender, RoutedEventArgs e)
 {
        CheckBox cb = (CheckBox)sender;
        StackPanel sp = (StackPanel)cb.Parent;
        Grid g = (Grid)sp.Parent;
        ContentPresenter cp = (ContentPresenter)VisualTreeHelper.GetParent(g);
        IList l = (IList)myTreeView.ItemsSource;
        object o = cp.Content;
        MessageBox.Show(l.IndexOf(o).ToString());
 }