2010-11-02 2 views
3

Я создал несколько DataTemplates для некоторых типов данных в моем проекте для домашних животных. Эти шаблоны данных действительно круты, поскольку они работают как магия, магически преобразуя внешний вид экземпляров типов данных всякий раз, когда и где они появляются в пользовательском интерфейсе. Теперь я хочу иметь возможность изменять DataTemplate для этих типов данных в одном конкретном ListBox. Означает ли это, что мне приходится перестать полагаться на WPF, автоматически применяя шаблон данных к типам данных и назначая x: Ключ к DataTemplates, а затем применяйте шаблон/ItemTemplate в пользовательском интерфейсе с помощью этого ключа?DataTemplate для DataType - как переопределить этот DataTemplate в определенном ListBox?

ListBox содержит элементы различных DataTypes (все полученные из общего базового класса) и, как сейчас, магически работает без указания шаблонаSelector, поскольку правильный шаблон выбирается фактическим типом данных элемента в ListBox. Если бы я пошел использовать x: Key для применения DataTemplates, мне нужно было бы написать TemplateSelector?

Я новичок в этом и только экспериментирую с DataTemplates. Один момент, я думаю, ничего себе, как здорово! И тогда мне нужен другой шаблон данных для одного и того же типа данных в другом списке и оооп, я не могу этого сделать :-) Помогите пожалуйста?

ответ

3

Вы можете указать ItemTemplate специально для ListBox:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <!-- your template here --> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Или же, если вы уже определили свой DataTemplate в ResourceDictionary где:

<DataTemplate x:Key="MyTemplate"> 
     <!-- your template here --> 
</DataTemplate> 

Затем вы можете ссылаться на него на ListBox с использованием:

<ListBox ItemTemplate="{StaticResource MyTemplate}" /> 

Вам не нужно написать селектор шаблона для любой из этих подходов к работе


Пример в ответ на комментарии

В приведенном ниже примере показано, задающих по умолчанию DataTemplate для типа данных (в этом случае, String) для окна, а затем overridding его в ListBox:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type sys:String}"> 
      <Rectangle Height="10" Width="10" Margin="3" Fill="Red" /> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListBox> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Rectangle Height="10" Width="10" Margin="3" Fill="Blue" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
      <sys:String>Three</sys:String> 
     </ListBox> 
    </Grid> 
</Window> 

Это про Duces следующий интерфейс:

Example Display

+0

DataTemplate У меня в ResourceDictionary ориентирована на конкретный тип данных и WPF применяет шаблон к любому экземпляру этого типа данных автоматически везде, где он появляется, так что даже когда я установил ItemTemplate от ListBox до {x: Null}, элементы все еще отображаются шаблонами. –

+0

Если вы установите 'ItemTemplate' в' {x: Null} 'Я бы ожидал, что он будет использовать шаблон по умолчанию - вы все равно получите такое же поведение, если явно укажете шаблон? –

+0

Спасибо за сообщение. Мне удалось применить другой ItemTemplate к элементам этого «специального» списка вчера, я не могу вспомнить, что именно было проблемой, это было что-то тонкое. Но часть вопроса остается - поскольку в списке есть три разных типа объектов. Для каждого из этих типов данных я указал DataTemplate, теперь, в этом конкретном списке, я бы хотел, чтобы эти типы данных выглядели по-разному. Я могу явно установить ItemTemplate, который затем переопределит те элементы данных, которые были упомянуты ранее, однако я получаю только один шаблон данных для всех трех типов. –

Смежные вопросы