WPF HiercharchicalDataTemplate.DataType: как реагировать на интерфейсы? - PullRequest
3 голосов
/ 03 ноября 2008

Задача

У меня есть коллекция IThing с, и я хотел бы создать HierarchicalDataTemplate для TreeView. Простое DataType={x:Type local:IThing}, конечно, не работает, вероятно, потому что создатели WPF не хотели обрабатывать возможные неоднозначности.

Поскольку это должно обрабатывать IThing s из разных источников одновременно, ссылка на реализующий класс исключена.

Текущее решение

Пока я использую ViewModel, который проксирует IThing через конкретную реализацию:

public interface IThing {
    string SomeString { get; }
    ObservableCollection<IThing> SomeThings { get; }
    // many more stuff
}

public class IThingViewModel
{
     public IThing Thing { get; }
     public IThingViewModel(IThing it) { this.Thing = it; }
}

<!-- is never applied -->
<HierarchicalDataTemplate DataType="{x:Type local:IThing}">

<!-- is applied, but looks strange -->
<HierarchicalDataTemplate
    DataType="{x:Type local:IThingViewModel}"
    ItemsSource="{Binding Thing.SomeThings}">
    <TextBox Text="{Binding Thing.SomeString}"/>
</HierarchicalDataTemplate>

Вопрос

Есть ли лучший (т.е. без прокси) способ?

Ответы [ 3 ]

4 голосов
/ 21 марта 2012

Другая альтернатива (аналогично решению jing): если у вас есть только один тип элемента, вы можете установить ItemTemplate напрямую. Тогда вам не нужно указывать ключ или тип данных.

В вашей ViewModel:

public ObservableCollection<IThing> Thingies { get; private set; }

В представлении:

<TreeView ItemsSource="{Binding Thingies}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SomeThings}">
            <TextBox Text="{Binding SomeString}" />    
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
3 голосов
/ 16 декабря 2008

Причина этого в том, что селектор шаблона по умолчанию поддерживает только конкретные типы, а не интерфейсы. Вам необходимо создать пользовательский DataTemplateSelector и применить его к свойству ItemTemplateSelector TreeView. Я не могу найти URL, где я нашел пример этого, но, надеюсь, с этой информацией, вы можете Google его.

2 голосов
/ 02 апреля 2010

Другое решение заключается в том, что вы даете ключ к HierarchicalDataTemplate и помещаете его в Windows.Resources и вручную ссылаетесь на него в TreeView. <TreeView ItemDataTemplate={StaticResource templateKey}/>

Но это ограничивает автоматический выбор шаблона данных в соответствии с типом данных, предоставляемым WPF TreeView.

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