Возникли проблемы с древовидными и многолистными иерархическими данными. - PullRequest
0 голосов
/ 25 мая 2010

У меня есть следующие 2 класса:

public class DeviceGroup
    {
        public String Name { get; set; }
        public ObservableCollection<DeviceGroup> DeviceGroups { get; set; }
        public ObservableCollection<Device> Devices { get; set; }


        public DeviceGroup()
        {
            Name = String.Empty;
            DeviceGroups = new ObservableCollection<DeviceGroup>();
            Devices = new ObservableCollection<Device>();
        }
    }

    public class Device
    {
        public String Name { get; set; }
    }

У моего основного класса есть ObservableCollection.

В моем Xaml - я могу легко создать древовидную структуру, если я просто укажу DeviceGroup в моем HierachicalDataTemplate, следующим образом:

<Window.Resources>
    <ResourceDictionary>
        <DataTemplate DataType="{x:Type local:Device}">
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:DeviceGroup}" ItemsSource="{Binding DeviceGroups}">
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </ResourceDictionary>
</Window.Resources>
<Grid>        
    <TreeView ItemsSource="{Binding DeviceGroups}"/>
</Grid>

Вопрос в том, как выбрать коллекцию устройств и группу устройств? Мне бы хотелось, чтобы на устройствах отображалось что-то вроде проводника Windows (каталоги и файлы). Есть ли Xaml решение этой проблемы? Или мне придется создать TreeViewItems в коде позади. Спасибо.

1 Ответ

0 голосов
/ 26 мая 2010

Единственное решение, которое я нашел на данный момент, находится внутри кода:

    private void LoadTree()
    {
        foreach (DeviceGroup dg in ttvm.DeviceGroups)
        {
            TreeViewItem tvi = new TreeViewItem();
            tvi.Header = dg;
            treeView1.Items.Add(tvi);
            AddTreeItems(tvi, dg);
        }
    }

    private void AddTreeItems(TreeViewItem node, DeviceGroup deviceGroup)
    {
        foreach (DeviceGroup dg in deviceGroup.DeviceGroups)
        {
            TreeViewItem groupTVI = new TreeViewItem();
            groupTVI.Header = dg;
            node.Items.Add(groupTVI);
            AddTreeItems(groupTVI, dg);
        }

        foreach (Device device in deviceGroup.Devices)
        {
            TreeViewItem deviceTVI = new TreeViewItem();
            deviceTVI.Header = device;
            node.Items.Add(deviceTVI);
        }
    }

LoadTree () вызывается после InitilizeComponent. Xaml изменился на: ресурсы окна:

        <HierarchicalDataTemplate DataType="{x:Type local:DeviceGroup}" ItemsSource="{Binding DeviceGroups}">
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>

с простым деревом в сетке.

...