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.