2009-06-22 51 views
0

這是從MSDN library article採取的ItemsControl.ItemTemplate屬性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>元素的圖形,並沒有問題存在。

我正在研究軸的標籤,我正在試用ItemTemplate中的<Grid>元素 - 但我不知道網格應該如何在此上下文中運行,並且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的建模正確。

+0

這就是我喜歡XAML/WPF的原因之一 - 如果你想要,你可以在控件中做一些*真的*瘋狂的東西...... – 2009-06-22 21:57:26

+0

這裏有太多的問題 - 我不知道從哪裏開始... – 2009-06-22 22:06:31

回答

4

「這個面板在列表框中存在的位置在哪裏?」 - 列表框將爲每個列表項目創建一個副本,即爲myTodoList集合中的每個元素創建一個副本。因此,在每個列表項目中,您將有三個標籤疊放在另一個之上。

「在ItemTemplate中它的用途是什麼?」 - 爲ItemsSource中的每個元素顯示多個控件。 ItemTemplate和WPF中的很多東西一樣,只能接受一個子元素,所以如果你想要多個子元素,你需要指定你希望如何佈局它們,並且通過添加一個面板(本例中爲StackPanel)來實現。

「是否可以使用任何System.Windows.Controls.Panel來代替它,特別是Grid?」 - 你打賭。

「我該如何使用<Grid>元素作爲ListBox中每個項目的模板?」 - 您可以在其他地方使用網格。它也不例外;只是ItemsControl(及其後代,ListBox)將創建Grid的多個實例。但請注意,在ItemTemplate內部,您的DataContext將成爲當前列表項,因此您的{Binding}將與該列表項相關(除非您另外指定了例如ElementName)。

「這看起來正確嗎?」 - 這應該作爲一個單獨的問題發佈,因爲它與有關MSDN示例的問題無關,而且我甚至不知道您要做什麼。但我會試着回答:我懷疑有什麼不對,因爲您使用兩種不同的方式名稱「GraphLabelYData」。在ColumnDefinition中,據我所知,您將GraphLabelYData視爲XAML元素的名稱(即,您正在窗口/頁面/ UserControl中尋找另一個控件,其中Name="GraphLabelYData"x:Name="GraphLabelYData",並閱讀該控件的GraphLabelMarkerLength屬性);但在TextBlock中,您將GraphLabelYData視爲當前集合項目上屬性的名稱。我懷疑其中一個是不正確的。

+4

非常感謝!我知道至少有一個人會忍受所有這些問題。我喜歡認爲最後一個問題是相關的 - 儘管可能不太清楚。我擔心在模板中使用面板元素。我不知道我是否使用了Grid,原因與StackPanel在示例中使用的原因相同,或者它甚至做同樣的事情。至於綁定,你提出一個有趣的觀點。 – Giffyguy 2009-06-22 22:47:15

+4

但是,我很困惑,因爲我沒有在TextBox中使用GraphLabelYData。我正在使用GraphLabelTag,它是當前集合項目的一個屬性(GraphLabelYData是有問題的集合,以及我的創建的一些自定義屬性,例如GraphLabelMarkerLength)。 – Giffyguy 2009-06-22 22:48:11

+4

現在這個問題已經有了一些進展 - 我沒有計劃提出有關數據綁定的問題......你讓我在那裏,哈哈。如果我更全面地解釋它們,你是否願意幫我處理綁定? – Giffyguy 2009-06-22 22:50:48