2016-10-11 3 views
-1

Вот мой конкретный сценарий.Как добавить DataTemplate в CollectionContainer?

Код окна ресурсы:

... 
<Window.Resources> 
    <ResourceDictionary> 
     <CollectionViewSource x:Key="AdditionalStringData" Source="{Binding ViewModelObservableCollection_String}"/> 
     <CollectionViewSource x:Key="AdditionalCustomObjectData" Source="{Binding ViewModelObservableCollection_CustomObject}"/> 
     <ResourceDictionary.MergedDictionaries> 
      ... 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
... 

часть, где мне нужно, чтобы отобразить Коллекция:

... 
<StackPanel> 
    <ItemsControl> 
     <ItemsControl.ItemsSource> 
      <CompositeCollection> 
       <TextBlock Text="{Binding ViewModelTextProperty}"/> 
       <Button Command="{Binding ViewModelRelayCommand}">Command</Button> 
       <CollectionContainer Collection="{Binding Source={StaticResource AdditionalStringData}}" /> 
       <CollectionContainer Collection="{Binding Source={StaticResource AdditionalCustomObjectData}}" /> 
      </CompositeCollection> 
     </ItemsControl.ItemsSource> 
    </ItemsControl> 
</StackPanel> 
... 

ViewModel (предположим, что он правильно переплетены)

... 
private string ViewModelTextProperty { get; set; } = "Sample Text"; 
public RelayCommand ViewModelRelayCommand { ... } 
private ObservableCollection<string> ViewModelObservableCollection_String { get; set; } = new ObservableCollection<string>(); 
private ObservableCollection<CustomObject> ViewModelObservableCollection_CustomObject { get; set; } = new ObservableCollection<CustomObject>(); 
... 

Класс CutomObject (это может быть необязательно показывать):

... 
public class CustomObject 
{ 
    public string firstString; 
    public string secondString; 

    public CustomObject() 
    { 
     ... 
    } 
    ... 
} 
... 

Предположим, что ObservableCollection s имеет надлежащее содержание.

Мой вопрос: Как я могу правильно отобразить коллекцию? Вот критерии:

  • На первой линии, будет TextBlock с текстом внутри него, что говорит «Sample Text»
  • Далее идет кнопка с меткой «Command»
  • Следующая строки (целых ViewModelObservableCollection_String элементов) являются TextBlocks. Его текст должен быть значением отдельного элемента ViewModelObservableCollection_String.
  • Следующие строки (целых ViewModelObservableCollection_CustomObject элементов) являются TextBoxes. Его текст должен быть значением отдельного элемента ViewModelObservableCollection_CustomObject (объединение firstString и secondString).

Как вы можете видеть, содержимое StackPanel представляет собой слияние более чем одной коллекции с различными DataTemplate.

Просьба уточнить, если что-то недостаточно ясно.

ответ

1
  1. Использование DataTrigger внутри ItemTemplate изменить ControlTemplate из Control используется, при сравнении Type. Для этого используйте конвертер, который вернет тип.

    или

  2. Использование ContentControl в ItemTemplate.

  3. Определить DataTemplate с указанием DataType в нем. ContentControl автоматически выберет подходящий DataTemplate за его ContentTemplate.

Второй подход (рекомендуется)

<Window.Resources> 
    <ResourceDictionary>    
     ... 
     <DataTemplate DataType="{x:Type sys:String}"> 
      <TextBlock Background="ForestGreen" Text="{Binding .}"/> 
     </DataTemplate> 

     <DataTemplate DataType="{x:Type local:CustomObject}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Background="Red" Text="{Binding firstString}"/> 
       <TextBlock Background="Red" Text="{Binding secondString}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ResourceDictionary> 
</Window.Resources> 
<ItemsControl> 
... 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding .}"/> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
... 
</ItemsControl> 
+0

Спасибо. Не могли бы вы рассказать о нем больше? Я относительно новичок в WPF. – someone

+0

Думаю, ваше второе предложение проще. Можете ли вы представить пример кода? Если нет, пожалуйста, дайте мне несколько ссылок. – someone

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