2011-11-15 65 views
0

我使用CompositeCollection主辦我想在ItemsControl控件來顯示對象的ItemsControl,我用this解決方案使用不同的DataTemplates爲不同的對象來實現,但是我想申請每種類型的在我的收藏中有不同的風格。我怎樣才能做到這一點?應用不同的風格

這是我的代碼:

<ItemsControl.Resources> 
      <DataTemplate DataType="{x:Type mapNamespace:MapObject}"> 
       <DataTemplate.Resources> 
        <Style TargetType="{x:Type ContentPresenter}"> 
         <Setter Property="Canvas.Left" Value="{Binding MapObjLocation.X}" /> 
         <Setter Property="Canvas.Top" Value="{Binding MapObjLocation.Y}" /> 
        </Style> 
       </DataTemplate.Resources> 
       <Rectangle Fill="#00000000" Height="10" Width="10" Stroke="Red"> 
        <Rectangle.ToolTip> 
         <StackPanel Orientation="Vertical"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="X: "/> 
           <TextBlock Text="{Binding MapObjLocation.X}" /> 
          </StackPanel> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="Y: " /> 
           <TextBlock Text="{Binding MapObjLocation.Y}" /> 
          </StackPanel> 
         </StackPanel> 
        </Rectangle.ToolTip> 
       </Rectangle> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewModel:ReferenceMapRectangle}"> 
       <DataTemplate.Resources> 
        <Style TargetType="{x:Type ContentPresenter}"> 
         <Setter Property="Canvas.Left" Value="{Binding X}" /> 
         <Setter Property="Canvas.Top" Value="{Binding Y}" /> 
        </Style> 
       </DataTemplate.Resources> 
       <Rectangle Height="{Binding Height, Mode=TwoWay}" Width="{Binding Width, Mode=TwoWay}" Stroke="White" StrokeThickness="6" 
          Canvas.Top="{Binding Y, Mode=TwoWay}" Canvas.Left="{Binding X, Mode=TwoWay}" > 

       </Rectangle> 
      </DataTemplate> 
     </ItemsControl.Resources> 

運行這個實際的結果是,MapObjects的將在Canvas正確的位置被顯示,但該ReferenceMapRectangle對象將保持固定在(0,0)在畫布上,永遠不會移動(寬度/高度確實會更新)

有沒有人有線索爲什麼會發生這種情況?我嘗試使用ItemsControl.ItemContainerStyle,但它只支持一種樣式,而不支持多種樣式。

謝謝!

+0

難道它是一個綁定問題而不是樣式問題?檢查你的調試輸出窗口。 –

+0

不要這樣想,因爲我的寬度/高度綁定正確。我認爲DataTemplate.Resources中的樣式不可訪問。代碼僅查看ItemsControl.ItemContainerStyle代碼... –

回答

1

ItemsControl中的每個項目都包裝在一個<ContentPresenter>標記中,所以在您的實際DataItem上應用您的定位將不會執行任何操作。

您可以使用ItemContainerStyle適用於ContentPresenter標籤,而不是你的DataItem標籤

例如定位,這裏是如何,如果你申請的定位到你的DataItem你的控制得到渲染:

<Canvas> 
    <ContentPresenter> 
     <DataItem Canvas.Left="50" Canvas.Top="50" /> 
    </ContentPresenter> 
    <ContentPresenter> 
     <DataItem Canvas.Left="100" Canvas.Top="50" /> 
    </ContentPresenter> 
    <ContentPresenter> 
     <DataItem Canvas.Left="150" Canvas.Top="50" /> 
    </ContentPresenter> 
</Canvas> 

這裏是如何應用您的控件如何應用定位ItemContainerStyle

<Canvas> 
    <ContentPresenter Canvas.Left="50" Canvas.Top="50"> 
     <DataItem /> 
    </ContentPresenter> 
    <ContentPresenter Canvas.Left="100" Canvas.Top="50"> 
     <DataItem /> 
    </ContentPresenter> 
    <ContentPresenter Canvas.Left="150" Canvas.Top="50"> 
     <DataItem /> 
    </ContentPresenter> 
</Canvas> 

另請參閱this blog entry of mine

+0

太好了,我想我現在已經開始工作了。謝謝瑞秋! –