#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
называется aDataTemplate
, а не aUserControlTemplate
?3. итак, вы пытаетесь сказать мне. что система стыковки окон должна сохранять коллекцию UC? итак, как я мог бы поменять пользовательский UC на Window без сбора UC?
4. Вовсе нет. Я говорю именно то, что я сказал: В WPF мы обычно не помещаем элементы пользовательского интерфейса в коллекции, вместо этого предпочитая работать с [коллекциями] пользовательских классов данных, у которых есть
DataTempate
s для определения того, как они должны выглядеть .