WPF привязывает коллекцию UserControl к ItemsControl. Проблема с таблицей данных

#wpf #datatemplate

#wpf #datatemplate

Вопрос:

http://www.filedropper.com/wpfapplication9 по этой ссылке есть проект в VS2013 с примером проблемы.

моя проблема в том, как установить DataTemplate в UserControl в ItemsControl.

     <ItemsControl ItemsSource="{Binding Collection}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
  

мои коллекции — это

 public IEnumerable<MyUC> Collection {get;}
  

мой MyUC — это

 public partial class MyUC : UserControl
{
    public string Title { get; set; }
}
  

Когда я пытаюсь показать эту коллекцию, я получаю

 MyUC.Content 
  

установлено

 MyUC.Title
  

когда я меняю ItemsSouce на ListBox, datatemplate начинает работать.
но мне нужно показать коллекцию без дополнений ListBox.

введите описание изображения здесь

Ответ №1:

Если я вас правильно понял, вы просто хотите отобразить значение Title свойства ваших UserControl объектов из вашей коллекции. Все, что вам нужно сделать, это объявить соответствующий DataTemplate для них в Resources разделе:

 <DataTemplate DataType="x:Type={YourPrefix:MyUC}">
    <TextBlock Text="{Binding Title}"/>
</DataTemplate>
  

Честно говоря, вы, кажется, подходите к этому неправильно. В WPF мы обычно не помещаем элементы пользовательского интерфейса в коллекции, вместо этого предпочитая работать с пользовательскими классами данных, которые имеют DataTempate s для определения того, как они должны выглядеть. В вашем случае это выглядело бы примерно так:

 <DataTemplate x:Key="TitleTemplate" DataType="x:Type={YourPrefix:MyDataClass}">
    <TextBlock Text="{Binding Title}"/>
</DataTemplate>
<DataTemplate x:Key="ControlTemplate" DataType="x:Type={YourPrefix:MyDataClass}">
    <YourControlPrefix:MyUC />
</DataTemplate>
  

Затем вы должны использовать TitleTemplate , когда хотите видеть только Title значения свойств, и ControlTemplate , когда хотите видеть все UserControl целиком.

Комментарии:

1. я пытался объявить DataTemplate в ресурсе, но он тоже не работает. мне нужна коллекция UC, потому что я пишу классы для поддержки системы стыковки.

2. мне нужна коллекция UC … нет, у вас ее нет… вы просто еще не понимаете, как правильно использовать WPF. Смотрите данных шаблонов, обзор страница на MSDN для получения дополнительной информации о том, как правильно его использовать. Кроме того, просто подумайте об этом… как вы думаете, почему a DataTemplate называется a DataTemplate , а не a UserControlTemplate ?

3. итак, вы пытаетесь сказать мне. что система стыковки окон должна сохранять коллекцию UC? итак, как я мог бы поменять пользовательский UC на Window без сбора UC?

4. Вовсе нет. Я говорю именно то, что я сказал: В WPF мы обычно не помещаем элементы пользовательского интерфейса в коллекции, вместо этого предпочитая работать с [коллекциями] пользовательских классов данных, у которых есть DataTempate s для определения того, как они должны выглядеть .