Вопрос

Это пример кода 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> в этом примере.
- GT &;
Где эта панель будет существовать в ListBox?
Какова его цель в ItemTemplate?
Можно ли использовать вместо него System.Windows.Controls.Panel, в частности, Grid?
Как мне использовать элемент <Grid> в качестве шаблона для каждого элемента в ListBox?

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

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

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

Я работаю над метками для осей и экспериментирую с использованием элемента <=> в 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 смоделирован правильно, прежде чем я начну отлаживать привязки данных и код.

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top