0

これは、ItemsControl.ItemTemplate プロパティ のMSDN ライブラリ記事から抜粋した XAML コード サンプルです。

<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 をその代わりに、特にグリッドで使用できますか? ListBox の各項目のテンプレートとして要素を
使用するにはどうすればよいですか?<Grid>

これが私が目指しているコンセプトです:

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

要素を使用してグラフを描画しました<Path>が、問題はありません。

私は軸のラベルに取り組んでおり<Grid>、ItemTemplate の要素を使用して実験していますが、このコンテキストでグリッドがどのように機能するのかわかりません。また、MSDN はサンプルのパネルについて何も述べていません。コード。

Y 軸ラベルの XAML は現在、次のようになっています。

<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 が正しくモデル化されていることを確認したいと考えています。

4

1 に答える 1

4

「このパネルは ListBox のどこに存在しますか?」- リストボックスは、リスト項目ごとに 1 つのコピーを作成します。つまり、myTodoList コレクションの各要素に対して 1 つです。したがって、各リスト項目内で、3 つのラベルが上下に積み上げられます。

「ItemTemplate での目的は何ですか?」- ItemsSource の各要素に対して複数のコントロールを表示できるようにするため。WPF の多くのものと同様に、ItemTemplate は 1 つの子要素しか取ることができないため、複数の子要素が必要な場合は、それらのレイアウト方法を指定する必要があり、パネル (この場合は StackPanel) を追加してそれを行います。

「その代わりに任意の System.Windows.Controls.Panel を使用できますか?具体的にはグリッドですか?」-きっと。

<Grid>「 ListBox の各項目のテンプレートとして要素を使用するにはどうすればよいですか?」- 他の場所でグリッドを使用するのと同じ方法。違いはありません。ItemsControl (およびその子孫である ListBox) がグリッドの複数のインスタンスを作成するだけです。ただし、ItemTemplate 内では、DataContext が現在のリスト アイテムに{Binding}なるため、s はそのリスト アイテムに対して相対的であることに注意してください (ElementName などで特に指定しない限り)。

「これは正しいように見えますか?」- これは、MSDN サンプルに関する質問とは無関係であるため、別の質問として投稿する必要があります。また、あなたが何をしようとしているのかもわかりません。しかし、私は答えようとします.「GraphLabelYData」という名前を2つの異なる方法で使用しているため、何かがおかしいのではないかと思います. ColumnDefinition では、私が知る限り、GraphLabelYData を XAML 要素の名前として扱っています (つまり、ウィンドウ/ページ/UserControl でName="GraphLabelYData"orを使用して別のコントロールを探し、x:Name="GraphLabelYData"そのコントロールの GraphLabelMarkerLength プロパティを読み取ります)。しかし、TextBlock では、GraphLabelYData を現在のコレクション アイテムのプロパティの名前として扱っています。そのうちの 1 つが正しくないと思われます。

于 2009-06-22T22:24:21.407 に答える