2016-11-05 4 views
0

スケジューリンググリッドに項目を表示するコントロールを作成しようとしています。そのカテゴリに応じて水平に配置されます。アイテムが完了するまでにどれくらいの時間がかかります。私は現在、System.Windows.Controls.Controlから継承していますし、デフォルトのスタイルとテンプレートを以下に示します。データ型を使用するWPFコントロールを作成する

<Style TargetType="KHS:TimeGrid"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="KHS:TimeGrid"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
          <DockPanel> 
           <Grid Name="PART_HeaderGrid" DockPanel.Dock="Top"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="{Binding ActualWidth, ElementName=TimeColumn}"/> 
            </Grid.ColumnDefinitions> 
           </Grid> 

           <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
            <Grid Name="PART_BodyGrid"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Name="TimeColumn" Width="Auto"/> 
             </Grid.ColumnDefinitions> 
            </Grid> 
           </ScrollViewer> 
          </DockPanel> 
         </ScrollViewer> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

私の項目については、私は単純に、このインターフェイスを使用します。

Public Interface ITimeGridItem 
    Property StartTime As Date 
    Property Duration As TimeSpan 
End Interface 

行をに追加されます各時間の増加分(デフォルトでは15分を表す)の "BodyGrid"と、開始時間と継続時間に基づいてGrid.RowとGrid.RowSpanの値が与えられます。

アイテムのDataTemplatesを実装しようとすると、問題が発生します。私は現在、アイテムを表示するためにContentPresentersを使用しようとしています。 TimeGridのItemTemplateプロパティを作成し、それをすべてのアイテムに使用するのは簡単ですが、ユニークなテンプレートでさまざまなタイプのアイテムをテンプレート化する必要がある場合はどうすればよいでしょうか?

他のコントロールで、DataTemplatesをさまざまなDataTypesでリソースコレクションに追加する方法を考えました。コントロールはリソースを検索して適切なテンプレートを選択することができます。残念ながら、私はそれを実装する方法を理解することができませんでした。私はこれをどのように達成することができるか知っていますか?マイクロソフトはそのコントロールでそれを実行するので、可能でなければなりません。

+1

"残念ながら私はそれを実装する方法を見つけ出すことができませんでした" - それは実装していないからです。それはちょうど起こる。暗黙的なDataTemplateがスコープ内にある場合は、それが使用されます。私はContentControlsのものを投げるだけで動作します。それを試して、私はそれが動作すると思う。 –

+0

方向として、System.Windows.Controls.DataTemplateSelectorを見てください。それはあなたが望むものの鍵を握っているかもしれません。しかし、私は確信していません。 –

答えて

0

私はそれがとてもシンプルだったとは思えません。私は実際に彼の全面的なコメントのために@ ed-plunkettにいくつかのクレジットを与える必要があります。私は少し難しく見て、私は、この変更された場合は偶然ことを発見:これに

<DataTemplate DataType="local:TestItem"> 

:それが動作

<DataTemplate DataType="{x:Type local:TestItem}"> 

を!

数分後、私はこの記事を見つけた:
http://briannoyesblog.azurewebsites.net/2013/11/23/use-xtype-with-wpf-implicit-datatemplates

*ため息*私は、私が以前にすることを発見した希望します。

{x:Type}構文を使用している限り、DataTemplateをスコープのどこにでも置くことができ、適用されます。

0

正確な答えを得るための具体的な実装については十分に分かりませんが、カスタムテンプレートを適用したラッパーコントロールを使用して、子ビューをレンダリングするContentControlを配置する方法を検討します彼らが自分でテンプレート化されているものは何でも。

グリッドをこのように使用しないけれども、正直言って、私が過去に行ったやり方はデータバインディングによるものです。表示するすべての項目のビューモデルを作成し、XプロパティとYプロパティを指定します。次に、XAMLで、キャンバスを背景とする単一のItemsControlですべてを描画し、アイテムのCanvas.TopとCanvas.Left dpをXとYにバインドします。このようにして、ビューモデルコードでは、必要な場所に子どもを正確に配置することができ、ビュークラス自体を呼び出すことなく単体テストできます。 XAMLを使って過度に賢明にしようとしなくなり、疎結合のデータバインディングに使用するだけで、複雑なGUIデザインが突然簡単に実装できるようになりました。

関連する問題