Установка TreeView.DataContext не обновляет дерево - PullRequest
0 голосов
/ 31 мая 2010

У меня есть список, который я привязал к TreeView. Настройка TreeView.DataContext работает - все отображается правильно. Затем я изменяю список (добавляю в него элемент) и снова устанавливаю TreeView.DataContext (с тем же значением), но дерево не обновляется новыми элементами. Как мне обновить дерево, чтобы обновить?

Это в основном мой код:

public class xItemCollection : ObservableCollection<xItem>
{
}

public class xItem : INotifyPropertyChanged
{
    xItemCollection _Items;
    string m_Text;

    public xItem()
    {
        _Items = new xItemCollection();
    }

    public xItemCollection Items {get{return _Items;}}
    public string Text {get{return m_Text;} set{m_Text=value;}}
}

class MyProgram
{
    xItem m_RootItem;

    void UpdateTree()
    {
        this.RootItem = new xItem();
        treeView.DataContext = this;
    }

    public xItem RootItem
    {
        get { return m_RootItem;}
        set { m_RootItem = value;}
    }
}

xaml:

<TreeView Name="Tree" ItemsSource="{Binding Path=RootItem.Items}" >

<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Items}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

Добавление элементов в список работает до тех пор, пока дерево не будет отображено в первый раз. После визуализации добавление / удаление элементов не обновляет дерево.

Ответы [ 2 ]

4 голосов
/ 31 мая 2010

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

у вас есть несколько вариантов здесь:

  1. присвойте нулевой значение текстовому тексту и переназначьте ваш список или вызовите любую другую "команду обновления", которая обновляет ваш текстовой текст данных, что на самом деле является довольно плохой идеей, поскольку все дерево должно быть восстановлено. 1008 *

  2. используйте ObservableCollection в качестве списка. Это автоматически вызывает событие CollectionChanged, если вы добавляете элемент, который WPF использует для обновления только ChangedParts из списка.

Я бы определенно рекомендовал использовать второй подход!

1 голос
/ 14 июня 2010

Мне нужно было реализовать INotifyPropertyChanged и затем запустить PropertyChanged при изменении RootItem. Мой код создавал новый список элементов, а затем назначал полный список RootItem. Без PropertyChanged TreeView никогда не знал, что RootItem изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...