В TreeView в WPF есть способ получить индекс выбранного дочернего узла и индекс родительского узла этого выбранного дочернего элемента - PullRequest
4 голосов
/ 28 марта 2019

Я пытаюсь заполнить дерево, используя трехуровневый объект.

Входными данными для древовидного представления является ObservableCollection (GroupClass), где GroupClass содержит свойство с именем devices = ObservableCollection (DeviceDetails).

Когда я щелкаю объект DeviceDetails в пользовательском интерфейсе, я хотел бы получить индекс элемента DeviceDetails и индекс объекта GroupClass, к которому он принадлежит.

Я успешно заполнил древовидную структуруиспользуя коллекцию GroupClass, используя иерархический шаблон и шаблон данных.

Я посмотрел, как получить подробную информацию о выбранном элементе в виде дерева, но в большинстве решений использовался триггер TreeViewItem.Selected.

В моем случае, поскольку я использую иерархический шаблон и шаблон данных, у меня нет какого-либо элемента TreeView, определенного в моем XAML.

Класс группы:

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; }
}

XAML-код для заполнения TreeView:

<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;

Когда я нажимаю кнопку «Переименовать устройство» или «Удалить устройство», я хочу изменить объект группы, созданный ранее.В конечном итоге мой пользовательский интерфейс изменяется, так как TreeView связывается с объектом groups.

...