/ / Co robi ten przykładowy kod MSDN? - ItemsControl.ItemTemplate - wpf, xaml, msdn, itemtemplate, sample

Co robi ten przykładowy kod MSDN? - ItemsControl.ItemTemplate - wpf, xaml, msdn, itemtemplate, sample

To jest przykład kodu XAML pobrany z Artykuł w bibliotece MSDN dla właściwości 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>

Szukam wyjaśnienia użycia rozszerzenia <StackPanel> element jest tym przykładem.
->
Gdzie ten panel będzie istniał w ListBox?
Jaki jest jego cel w ItemTemplate?
Czy zamiast niego można użyć dowolnego System.Windows.Control.Panel, a konkretnie Grid?
Jak bym zaczął używać <Grid> element jako szablon dla każdego elementu w ListBox?

Oto koncepcja, do której zmierzam:

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

Narysowałem wykres za pomocą <Path> element i nie ma tam żadnych problemów.

Pracuję nad etykietami osi i eksperymentuję z użyciem <Grid> element w ItemTemplate - ale nie mam pojęcia, jak siatka ma funkcjonować w tym kontekście, a MSDN nic nie mówi o panelu w ich przykładowym kodzie.

Mój kod XAML dla etykiet osi Y wygląda obecnie następująco:

<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>

Czy to wygląda dobrze? Nic nie pojawia się w czasie wykonywania, ale chcę się upewnić, że kod XAML jest modelowany poprawnie, zanim zacznę debugować powiązania danych i związany z kodem.

Odpowiedzi:

4 dla odpowiedzi № 1

„Gdzie ten panel będzie istniał wListBox? ”- Listbox utworzy jedną kopię dla każdego elementu listy, tj. Jedną dla każdego elementu w kolekcji myTodoList. Tak więc w każdym elemencie listy trzy etykiety będą ułożone jedna nad drugą.

„Jaki jest jego cel w ItemTemplate?"- Aby umożliwić wyświetlanie więcej niż jednej kontrolki dla każdego elementu w ItemsSource. ItemTemplate, podobnie jak wiele rzeczy w WPF, może przyjmować tylko jeden element podrzędny, więc jeśli chcesz mieć wiele elementów podrzędnych, musisz określić, jak chcesz je układać i robisz to, dodając panel (w tym przypadku StackPanel).

„Czy w jego miejsce można zastosować dowolny System.Windows.Control.Panel, a konkretnie Grid?” - Pewnie.

„Jak bym zabrał się za używanie pliku <Grid> element jako szablon dla każdego elementu wListBox? ”- w taki sam sposób, w jaki używałbyś siatki gdziekolwiek indziej. Nie jest inaczej; chodzi po prostu o to, że ItemsControl (i jego potomek ListBox) utworzy wiele wystąpień Twojej siatki. Pamiętaj jednak, że wewnątrz elementu ItemTemplate Twój DataContext będzie bieżącym elementem listy, a zatem {Binding}s będzie względne w stosunku do tego elementu listy (chyba że określisz inaczej za pomocą np. ElementName).

„Czy to wygląda dobrze?„- To naprawdę powinno zostać opublikowane jako osobne pytanie, ponieważ nie ma związku z pytaniami dotyczącymi próbki MSDN i nie jestem nawet pewien, co próbujesz zrobić. Spróbuję jednak odpowiedzieć: podejrzewam, że coś jest nie tak, ponieważ „używasz nazwy„ GraphLabelYData ”na dwa różne sposoby. O ile wiem, w ColumnDefinition „traktujesz GraphLabelYData jako nazwę elementu XAML (tj. Szukasz innej kontrolki w oknie / stronie / UserControl z Name="GraphLabelYData" lub x:Name="GraphLabelYData"i czytając ten element sterującyGraphLabelMarkerLength); ale w TextBlock traktujesz GraphLabelYData jako nazwę właściwości w bieżącym elemencie kolekcji. Podejrzewam, że jedna z nich nie jest właściwa.