2011-11-15 5 views
0

ItemsControlコントロールに表示するオブジェクトをホストするのにCompositeCollectionを使用していますが、別のオブジェクトに異なるDataTemplatesを使用して実装するためにthisソリューションを使用しましたが、それぞれのタイプ私のコレクションには別のスタイルがあります。これどうやってするの?ItemsControlと異なるスタイルを適用する

これは私のコードである:

<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を使ってみましたが、複数のスタイルではなく1つのスタイルしかサポートしていません。

ありがとうございます!

+0

スタイルの問題ではなくバインディングの問題になりますか?デバッグ出力ウィンドウを確認してください。 –

+0

私の幅/高さが正しくバインドされているとは思わないでください。私は、DataTemplate.Resourcesのスタイルにアクセスできないと思います。コードはItemsControl.ItemContainerStyleコードのみを参照しています... –

答えて

1

ItemsControlの各項目は<ContentPresenter>タグで囲まれているため、実際のDataItemでの位置付けは何も行いません。

あなたが代わりにあなたのDataItemタグ例えば

ContentPresenterタグにポジショニングを適用するためにItemContainerStyleを使用することができますが、ここでは、あなたの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

すごく、私はそれが今働いていると思います。レイチェルありがとう! –

関連する問題