Как я могу сделать динамически изменяемые столбцы для иерархического TreeView? - PullRequest
1 голос
/ 03 ноября 2019

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

Я использовал следующий пример Microsoft для создания проекта: https://github.com/ariesy/WPFSamples/tree/master/TreeListView/cs

В примере, который у меня естьСейчас 3 столбца, но я должен сделать его динамически изменяемым во время выполнения. Это означает, что мне нужно удалить некоторые столбцы или добавить новые в пользовательских событиях. Как я могу решить эту проблему?

Я пробовал кое-что, но я все еще не настолько опытен в WPF и, к сожалению, мне пришлось отказаться, потому что это заняло у меня много времени, поэтому мне нужнонебольшая помощь - некоторые полезные ссылки, идеи и т. д.

Я загрузил мой пример проекта в github, потому что он слишком большой, чтобы делиться всем кодом здесь (ветвь treeListView): https://github.com/mystic997/UnityIocSample/tree/sample/treeListView

Следующие файлы в этом проекте важны для моего вопроса:

  • UnityIoCWpfSample.UI.Views.TreeListViewTable. TreeListView.xaml
  • UnityIoCWpfSample.UI.Views.TreeListViewTable. TreeListViewModel - этот класс ViewModel имеет свойство с именем MyTree, которое связано с ContentControl в предыдущем xaml
  • UnityIoCWpfSample.UI.Views.TreeListViewTable.CustomControls. TreeListView
  • UnityIoCWpfSample.UI.Views.TreeListViewTable.CustomControls. 1040 * ** 10View*

Я думаю, что мне нужно реорганизовать мой GridViewColumnCollection, в котором есть ключ с именем gvcc.

<GridViewColumnCollection x:Key="gvcc">
    <GridViewColumn Header="Title" 
                    CellTemplate="{StaticResource HierarchicColumn}"
                    Width="250" />
    <GridViewColumn Header="Description"
                    DisplayMemberBinding="{Binding Text}"
                    Width="200" />
    <GridViewColumn Header="IsEnabled"
                    Width="60">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <CheckBox HorizontalAlignment="Center"
                          IsChecked="{Binding IsEnabled}" />
            </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>
</GridViewColumnCollection>

И мне нужно хранить столбцы в моем TreeListViewItem классе:

public class TreeListViewItem : TreeViewItem
{
    public object Content { get; set; }
    private int _level = -1;
    public int Level
    {
        get
        {
            if (_level == -1)
            {
                TreeListViewItem parent = ItemsControlFromItemContainer(this) as TreeListViewItem;
                _level = (parent != null) ? parent.Level + 1 : 0;
            }
            return _level;
        }
    }

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TreeListViewItem();
    }
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is TreeListViewItem;
    }
}

Но если я сделаю это, мой первый столбец, имеющий иерархический шаблон, не может быть легко реализован.

...