Привязка дерева произвольной глубины к TreeView - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть следующий интерфейс (как вы можете видеть, я немного адаптирую шаблон MVVM):

public interface IViewModel {
    string Header { get; }
    IEnumerable<IViewModel> Nodes { get; }
}

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

У меня есть следующий XAML:

<TreeView ItemsSource="{Binding}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type ViewModel:IViewModel}" ItemsSource="{Binding Nodes}">
            <TextBlock Text="{Binding Header}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

и установка верхнего уровняузел к DataContext окна:

IViewModel model = ViewModelFactory.GetTopLevelViewModel();
DataContext = model;

Однако в древовидном представлении ничего не появляется.Я рассмотрел довольно много похожих вопросов по SO и в других местах, но, похоже, ни один из них не решил мою проблему.Несколько вопросов:

  1. Почему мне нужно установить DataContext родительского окна, а не сам TreeView?
  2. Почему в древовидном представлении ничего не появляется?
  3. Как мне это исправить?

1 Ответ

0 голосов
/ 15 февраля 2011

Почему мне нужно установить DataContext родительского окна, а не сам TreeView?

Вам не нужно.Вы можете установить контекст данных для самого TreeView:

<TreeView x:Name="tree"...>

-

IViewModel model = ViewModelFactory.GetTopLevelViewModel();
tree.DataContext = model;

Почему в древовидном представлении ничего не отображается?

TreeView является ItemsControl.Чтобы он отображал что-то, вам необходимо присвоить его свойство ItemsSource коллекции .

Как это исправить?

Например, вы можете установить DataContext для набора IViewModel элементов вместо одного элемента:

IViewModel model = ViewModelFactory.GetTopLevelViewModel();
tree.DataContext = new IViewModel[] { model };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...