Связывание WPF TreeView с использованием MVVM и WCF - PullRequest
0 голосов
/ 29 марта 2011

В настоящее время я разрабатываю приложение WPF с использованием шаблона MVVM. View, Model, ViewModel находятся в отдельной библиотеке классов.

My View имеет элемент управления TreeView, который должен быть заполнен с использованием привязки данных.

Я получаю свои данные из службы WCF, доступ к которой осуществляется через модель. Моя модель имеет ссылки на службу WCF и вызывает метод из WCF для извлечения вложенной коллекции.

ViewModel делает данные доступными для просмотра. Извлечение данных и т. Д. Все работает нормально, за исключением отображения их в TreeView.

Мой XAML для TreeView выглядит так

<TreeView Grid.Row="1" ItemsSource="{Binding CustomerTree}" >
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type ....}" ItemsSource="{Binding Path=Children}">
                    <TextBlock Text="{Binding Path=Name}"/>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type ....}" ItemsSource="{Binding Path=Children}">
                    <TextBlock Text="{Binding Path=ID}"/>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>

Свойство DataType = "{x: Type .....} ожидает определенный тип, который должен быть одним из типов в моей вложенной коллекции, но представление не знает, какие типы доступны. Мой ViewModel может получить доступ к типы ссылки на службу в модели, например тип клиента, с использованием Model.ServiceReference.Customer.

Является ли Модель подходящим местом для добавления ссылки на услугу? Как я должен заставить мой TreeView отображать данные?

Спасибо

Грант

1 Ответ

0 голосов
/ 29 марта 2011

Вам придется немного причинить себе неудобства, чтобы достичь желаемого уровня абстракции.Решение этой проблемы требует нескольких шагов:

  1. Не определяйте DataType для ваших шаблонов (используйте x:Key вместо).Это является источником неудобств: шаблоны больше не будут применяться автоматически.Но с другой стороны, вы только что избавились от ссылок на конкретные имена типов.
  2. Используйте свойство ItemTemplate или ItemTemplateSelector в TreeView, чтобы вручную выбрать HierarchicalDataTemplate для каждого элемента.

Для второго шага описания и примеры обоих методов предоставлены моим ответом на другой вопрос .

Конечным результатом является то, что вы сможетевыберите нужный шаблон, не ссылаясь на определенные типы в XAML, а используя вместо этого свойство объекта с данными.

...