C# 在WPF中的树视图中,是否有方法获取所选子节点的索引以及所选子项的父节点的索引

C# 在WPF中的树视图中,是否有方法获取所选子节点的索引以及所选子项的父节点的索引,c#,wpf,data-binding,treeview,C#,Wpf,Data Binding,Treeview,我正在尝试使用三级对象填充treeview treeview的输入是ObservableCollection(GroupClass),其中GroupClass包含一个名为devices=ObservableCollection(DeviceDetails)的属性 当我在UI中单击DeviceDetails对象时,我想获取DeviceDetails项的索引以及它所属的GroupClass对象的索引 我已经使用一个分层模板和数据模板,使用GroupClass的集合成功地填充了treeview 我已经

我正在尝试使用三级对象填充treeview

treeview的输入是ObservableCollection(GroupClass),其中GroupClass包含一个名为devices=ObservableCollection(DeviceDetails)的属性

当我在UI中单击DeviceDetails对象时,我想获取DeviceDetails项的索引以及它所属的GroupClass对象的索引

我已经使用一个分层模板和数据模板,使用GroupClass的集合成功地填充了treeview

我已经研究了如何在treeview中获取所选项目的详细信息,但大多数解决方案都使用treeview.selected触发器

在我的例子中,由于我使用的是分层模板和数据模板,所以在我的XAML中没有定义任何TreeView项

组别:

public class GroupClass
{
    public GroupClass()
    {
        this.devices = new ObservableCollection<DeviceDetails>();
    }

    public string groupName { get; set; }
    public ObservableCollection<DeviceDetails> devices { get; set; }
}

public class DeviceDetails
{
    public DeviceDetails()
    {
        this.status = "Online";
        this.ipAddress = "192.168.1.1";
        this.dateAccessed = DateTime.Now;
    }

    public string deviceName { get; set; }
    public string status { get; set; }
    public DateTime dateAccessed { get; set; }
    public string ipAddress { get; set; }
}
公共类GroupClass
{
公共组类()
{
this.devices=新的ObservableCollection();
}
公共字符串组名{get;set;}
公共可观察收集设备{get;set;}
}
公共类设备详细信息
{
公共设备详情()
{
this.status=“在线”;
this.ipAddress=“192.168.1.1”;
this.dateAccessed=DateTime.Now;
}
公共字符串deviceName{get;set;}
公共字符串状态{get;set;}
公共日期时间日期访问{get;set;}
公共字符串ipAddress{get;set;}
}
用于填充TreeView的XAML代码:

<Grid x:Name="ListPage" HorizontalAlignment="Stretch" Margin="0,80,0,0" >
    <TreeView x:Name="HostTreeView" HorizontalAlignment="Stretch" >
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:GroupClass}" ItemsSource="{Binding devices}">
                <Grid HorizontalAlignment="Stretch"  Name="HeaderPanel5">
                    <Grid Margin="0,0,0,0" >
                        <TextBlock Text="{Binding groupName}" />
                    </Grid>
                </Grid>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type local:DeviceDetails}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox  x:Name="checkBox"  />
                    <TextBlock  Text="{Binding deviceName}" />
                    <TextBlock  Text="{Binding status}" />
                    <TextBlock  Text="{Binding dateAccessed}" />
                    <TextBlock  Text="{Binding ipAddress}" />
                    <Button Content="Rename Device"  Height="30"/>
                    <Button Content="Remove Device"  Height="30"/>
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>
</Grid>


我创建了一个ObservableCollection类型的新对象,并将值从XML文件加载到其中。然后将创建的对象绑定到TreeView ItemsSource

public static ObservableCollection<GroupClass> groups = new ObservableCollection<GroupClass>();
StreamReader sr = new StreamReader("IPProfileData");
XmlSerializer srlzr = new XmlSerializer(typeof(ObservableCollection<GroupClass>));
groups = (ObservableCollection<GroupClass>)srlzr.Deserialize(sr);
HostTreeView.ItemsSource = groups;
公共静态ObservableCollection组=新ObservableCollection();
StreamReader sr=新的StreamReader(“iProFileData”);
XmlSerializer srlzr=新的XmlSerializer(typeof(observeCollection));
groups=(observetecollection)srlzr.反序列化(sr);
HostTreeView.ItemsSource=组;

单击“重命名设备”或“删除设备”按钮时,我希望更改先前创建的组对象。最终,当TreeView与groups对象绑定时,我的UI会发生变化。

您真的需要项目的索引还是只需要对项目本身的引用?@FlatEric如果可以通过该引用更改/删除后端原始对象ObservableList中的所选项目,然后这个引用对我来说很好。我会向ViewModel添加一个命令并将其绑定到您的按钮中:
Command=“{Binding DataContext.RenameCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeView}}}”CommandParameter=“{Binding}”
@FlatEric我在实现中没有使用MVVM模型:(您也可以绑定到CodeBehind中的元素,您只需要设置DataContext,例如:
DataContext=“{Binding RelativeSource={RelativeSource Self}}
在您的窗口或用户控件中