Что делает этот пример кода MSDN? - ItemsControl.ItemTemplate - PullRequest
0 голосов
/ 23 июня 2009

Это пример кода XAML, взятый из статьи библиотеки MSDN для свойства ItemsControl.ItemTemplate:

<ListBox Width="400" Margin="10" ItemsSource="{Binding Source={StaticResource myTodoList}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=TaskName}" />
<TextBlock Text="{Binding Path=Description}"/>
<TextBlock Text="{Binding Path=Priority}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>  

В этом примере я ищу объяснение использования элемента <StackPanel>.
->
Где эта панель будет существовать в ListBox?
Какова его цель в ItemTemplate?
Можно ли использовать вместо него любой System.Windows.Controls.Panel, в частности Grid?
Как мне использовать элемент <Grid> в качестве шаблона для каждого элемента в ListBox?

Вот концепция, к которой я иду:

http://img151.imageshack.us/img151/7960/graphconcept.png

Я нарисовал график, используя элемент <Path>, и проблем там нет.

Я работаю над метками для осей и экспериментирую с использованием элемента <Grid> в ItemTemplate - но я понятия не имею, как сетка должна функционировать в этом контексте, и MSDN ничего не говорит о панели в их примере кода.

Мой XAML для меток оси Y в настоящее время выглядит следующим образом:

<ListBox Background="Transparent" BorderThickness="0" ItemsSource="{Binding Path=GraphLabelYData}">
<ListBox.ItemTemplate>  
<DataTemplate>  
<Grid>  
<Grid.RowDefinitions>  
<RowDefinition Height="{Binding Path=GraphLabelSpacing}" />  
</Grid.RowDefinitions>  
<Grid.ColumnDefinitions>  
<ColumnDefinition Width="Auto" />  
<ColumnDefinition Width="{Binding ElementName=GraphLabelYData, Path=GraphLabelMarkerLength}" />  
</Grid.ColumnDefinitions>  
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding Path=GraphLabelTag}" />  
<Rectangle Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Stroke="Black" Fill="Black" />  
</Grid>  
</DataTemplate>  
</ListBox.ItemTemplate>  
</ListBox>  

Это выглядит правильно? Во время выполнения ничего не появляется, но я хочу убедиться, что XAML смоделирован правильно, прежде чем я начну отлаживать привязки данных и код позади.

1 Ответ

4 голосов
/ 23 июня 2009

"Где эта панель будет существовать в ListBox?" - Список будет создавать одну копию для каждого элемента списка, то есть по одной для каждого элемента в коллекции myTodoList. Таким образом, внутри каждого элемента списка у вас будут три надписи, расположенные друг над другом.

"Какова его цель в ItemTemplate?" - Чтобы можно было отображать более одного элемента управления для каждого элемента в ItemsSource. ItemTemplate, как и многие другие элементы в WPF, может принимать только один дочерний элемент, поэтому, если вы хотите иметь несколько дочерних элементов, вам нужно указать, как вы хотите, чтобы они были размечены, и сделать это, добавив панель (в данном случае StackPanel). *

"Может ли любой System.Windows.Controls.Panel использоваться вместо него, в частности, Grid?" - Вы ставите.

"Как мне использовать элемент <Grid> в качестве шаблона для каждого элемента в ListBox?" - Точно так же, как вы бы использовали Grid где-нибудь еще. Это не отличается; просто ItemsControl (и его потомок ListBox) создадут несколько экземпляров вашей Grid. Обратите внимание, что внутри ItemTemplate ваш DataContext будет текущим элементом списка, и поэтому ваши {Binding} будут относительными к этому элементу списка (если вы не укажете иное, например, с ElementName).

"Это выглядит правильно?" - Это действительно должен быть опубликован как отдельный вопрос, поскольку он не связан с вопросами о образце MSDN, и я даже не уверен, что вы пытаетесь сделать. Но я постараюсь ответить: я подозреваю, что что-то не так, потому что вы используете имя "GraphLabelYData" двумя разными способами. В ColumnDefinition, насколько я могу судить, вы рассматриваете GraphLabelYData как имя элемента XAML (т.е. вы ищете другой элемент управления в окне / page / UserControl с помощью Name="GraphLabelYData" или x:Name="GraphLabelYData" и читаете свойство GraphLabelMarkerLength этого элемента управления); но в TextBlock вы рассматриваете GraphLabelYData как имя свойства в текущем элементе коллекции. Я подозреваю, что один из них не прав.

...