2013-02-05 75 views
2

我有一個數組(存儲爲ObservableCollection)我動態實例化的數據,並且我將它鏈接到中的ItemsControl。該數據被格式化,像這樣:用於將ObservableCollection解釋爲StackPanel的元素的WPF樣式

public class VariableValueList<T> 
{ 
    public String Name {get; private set;} 
    public IList<T> Values {get; private set;} 
    ... 
} 

和我ObservableCollection<VariableValueList<double>> IVCollection,建成後,連接到ItemsControl有以下幾點:

MainWindow.xaml.cs

private void Open_OnClick(object sender, RoutedEventArgs e) 
{ 
    ... 
    IndependentVariables.ItemsSource = IVCollection; 
} 

其中IndependentVariables起源這裏:

MainWindow.xaml

 <StackPanel> 
      <ItemsControl Name="IndependentVariables" Style="{StaticResource IVCell}"></ItemsControl> 
     </StackPanel> 

我需要構造樣式IVCell有機會獲得各VariableValueList<double>(一旦我得到的是,這將是微不足道的,以獲得其NameValues成員)。

我需要格式化數據,使得對於每個元素,NameValues被印刷,像這樣:

名稱

值值值...

名稱

Value Value Value ...

...

利用現有的StackPanel。我知道這個問題至少有兩個基本問題。

  1. 我該如何給這個數組提供樣式訪問? (或:我有陣列後如何修改樣式?)

  2. 如何在動態樣式中實例化新元素(例如,對於每個數組元素)?

我真的很感謝你的幫忙。如果我試圖以這種方式構建任何東西完全錯誤,請糾正我。我對WPF相當陌生。

回答

4

你不需要額外的StackPanel,因爲ItemsControl將創建它自己的項目面板。 樣式不需要訪問數組,ItemsControl自動創建和管理所有項目的容器。所有你需要的是爲這兩種類型的物品提供DataTemplate。您可以使用DataTemplate中的另一個ItemsControl作爲VariableValueList<double>以顯示Values屬性中包含的項目。要獲得水平佈局,請爲ItemsControl設置自定義ItemsPanelTemplate

簡單的款式入手:

<Style TargetType="{x:Type ItemsControl}" 
     x:Key="IVCell"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}" /> 
        <ItemsControl ItemsSource="{Binding Values}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <WrapPanel /> 
           <!-- or <StackPanel Orientation="Horizontal"> --> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding}" Margin="2,0" /> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

謝謝你的答覆。我的成員'Name'和'Values'是代碼隱藏的依賴屬性嗎?我不知道如何將它們鏈接到'IVCollection'。 – Joseph

+0

我應該澄清。當試圖在XAML中綁定時,Name和Value不會被註冊爲有效。如果我將DataType =「{x:Type local:MainWindow}」'添加到'DataTemplate',我可以得到依賴屬性,但我不相信這就是我想要的。 – Joseph

+0

在表達式'TargetProperty = {綁定SourceProperty}' - 'TargetPropery'必須是依賴屬性,但'SourceProperty'可以是一個簡單的屬性。如果你真的需要這些屬性作爲綁定的目標,那麼答案是'是' - 它們必須是依賴屬性。 – max

相關問題