2011-08-07 64 views
2

我想知道它是否可能以某種方式將列表列表綁定到cavas面板。例如具有對象「層」,其本身是「矩形」對象的列表。如果有可能將圖層列表綁定到畫布上?到目前爲止,我只能通過將一個扁平的INumerable嵌套列表(使用SelectMany函數)綁定到一個itemcontrol來實現,但這並不夠好,我喜歡將「圖層」分開並讓矩形的Zindex根據它所在的層,允許輕鬆地重新排列圖層。將嵌套列表綁定到WPF畫布面板

我也試過嵌套itemcontrols,但如預期它只顯示第一層。其目的是爲畫布上每一層的每個對象繪製一個矩形,以允許進行圖層操作,在每個圖層中插入新對象等...

在此先感謝! :)

回答

3

如何使主ItemsControl的另一個ItemsControl的另一個ItemsControl的ItemTemplate作爲ItemsPanel? (我沒有看到它應該只顯示第一層的原因)

其實主要的ItemsControl不需要是一個Canvas,一個Grid也可以做到這一點(至少除非你的集合有自己的座標或Z順序,如果您使用網格,則圖層順序與它們在集合中的外觀相同)。

一個例子(有點冗長,但不能做任何事情):

<ItemsControl ItemsSource="{Binding Data}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding LayerItems}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemContainerStyle> 
        <Style TargetType="{x:Type ContentPresenter}"> 
         <!-- Here would the binding to some properties that take care of placement --> 
         <Setter Property="Canvas.Top" Value="{Binding Top}" /> 
         <Setter Property="Canvas.Left" Value="{Binding Left}" /> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
       <ItemsControl.ItemTemplate> 
        <!-- Some template for the individual items --> 
        <DataTemplate> 
         <Border Padding="5" BorderThickness="1" BorderBrush="Red" CornerRadius="3" 
           Background="White"> 
          <TextBlock Text="{Binding Name}" /> 
         </Border> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

謝謝!這是我試圖實現的初始解決方案,但我想我做錯了什麼。它現在工作正常,再次感謝。 – ssaammuueell

+0

不客氣,很高興幫助:) –

0

像H.B說,我也不能明白了一個道理,爲什麼它不會工作。在另一個ItemsContainer中使用ItemsControl完美無缺。

<ItemsControl ItemsSource="{Binding Layers}"> 
    <ItemsControl.ItemsContainerStyle> 
    <Style> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate> 
     <ItemsControl ItemsSource="{Binding Rectangles}"/> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
    <ItemsControl.ItemsContainerStyle> 
</ItemsControl> 

但認爲這將是清潔劑把子ItemsControlDataTemplate爲您的項目裏面,而不需要修改ItemsContainerStyle。如果你的控制需要知道模型屬性的信息,我認爲它的設計不好,這對綁定到Rectangles是必要的。