2010-03-11 54 views
3

我對WPF相當陌生。我有一個使用L2S顯示來自SQL數據庫的數據的頁面。 L2S返回一個DataTable,其中包含爲特定區域選擇的所有可用選項。從數據庫返回的每一行都需要是checkbox,我想將這些複選框放入stackpanel用數據庫中的複選框填充StackPanel

我在看數據綁定到StackPanel?這感覺不對......我猜測我需要循環訪問DataTable併爲每行創建複選框項目,然後在運行時將它們添加到StackPanel。它是否正確?是否返回DataTable我的問題的一部分?

我看到StackPanel有一個DataContext屬性,但我不能只是設置,因爲它不知道使每個項目checkbox,正確嗎?

回答

8

你可能想要一個ItemsControl。這允許您使用指定的DataTemplate呈現一系列項目。你可以這樣做內聯的ItemsControl的:

<ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

或從資源明確引用數據模板......更多的東西一樣:

<!-- In some parent resource section --> 
    <DataTemplate x:Key="MyDataTemplateName"> 
     <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
    </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}"> 
    </ItemsControl> 

,也可以定義一個DataTemplate定義外觀並感受你的約束類。 (請注意,如果您的LINQ到SQL是伸入一個匿名類型,這不是一個選項)喜歡的東西:

 <!-- In some parent resource section --> 
     <DataTemplate DataType="{x:Type MyBoundClass}"> 
      <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
     </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
    </ItemsControl> 

WPF然後將尋找每一個項目的數據類型相匹配一個DataTemplate在你的收藏。請注意,這對綁定需要不同演示文稿的異構集合非常有幫助。

您可以綁定Stackpanel的DataContext,但沒有爲每個數據元素重複模板的內在邏輯。它只是爲子控件提供一個上下文,幷包含{Binding ...}陳述。處理重複數據的所有控件都從ItemsControl中下載並通過ItemsSource屬性獲取其數據。

+0

+1好,徹底的答案。 – 2010-03-11 15:09:37

3

除了Ben Von Handorf的回答,我認爲應該提一下,你也可以通過改變ItemsPanel來改變ItemsControl排列元素的方式。例如:

<ListBox ItemsSource="{Binding MyCollection}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

這使得ListBox中安排的項目水平,而不是垂直。如果您希望項目像文本一樣「流動」(如果知道html,則可以使用span),也可以使用WrapPanel。 WrapPanel也可以水平或垂直取向。 (但是儘量不要使用WrapPanel來處理大量的項目,因爲它不是虛擬化的,並且會導致一些大的延遲。)

你甚至可以創建自己的自定義面板並替換它們。我曾經制作過一個隨機佈置它的項目,並將其用於ListBox。我的綁定集合中的每個項目都顯示在ListBox中的隨機位置。每次佈局刷新時,這些項目都有了新的位置。

+1

優秀點...我應該報道這一點。感謝填補我的洞。 :) – 2010-03-11 15:44:12