と の 2 つのオブジェクトがあります。これは Bicycle を継承Bicycle
しBicycleFullSuspension
、追加のプロパティ (文字列と小数点) を含みます。のオブジェクトが属するクラスに応じて、 DataTemplate または DataTemplate のDataTemplateSelector
いずれかを選択する機能を作成することができました。これらのテンプレートは両方とも、親テンプレートにバインドされています。LbxItemTemplateBicycle
LbxItemTemplateFullSuspension
ObservableCollection
ListBoxItemTemplate
各オブジェクトに関する情報を ListBox に表示しようとしていますが、継承する各テンプレートは、親 DataTemplate のグリッドにいくつかのフィールドを追加する必要があります。私の問題は、継承されたテンプレートの 1 つから ListBoxItemTemplate のグリッドに WPF 要素を追加する方法がわからないことです。テンプレートのグリッドにキーを割り当てることができないため、追加の TextBlocks が親テンプレートと同じグリッドに配置されるように指定する方法がわかりません。(現在、追加の TextBlocks は親グリッドの上に積み重ねられています。)
<DataTemplate x:Key="ListBoxItemTemplate">
<Border Name="LbxItemTemplate" BorderBrush="DarkRed" BorderThickness="2" Padding="5" Margin="5">
<Grid>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Bike Year:" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding BikeYear}" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Bike Color: "/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding BikeColor}"/>
...
</Grid>
</Border>
</DataTemplate>
<DataTemplate x:Key="LbxItemTemplateFullSuspension" DataType="{x:Type app:BicycleFullSuspension}">
<Grid>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource ListBoxItemTemplate}" />
<TextBlock Grid.Row="6" Grid.Column="0" Text="Shock Travel"/>
<TextBlock Grid.Row="6" Grid.Column="1" Text="{Binding ShockTravel}"/>
</Grid>
</DataTemplate>
この点に到達するために、これらのリンクが役立つことがわかりました。
http://dariosantarelli.wordpress.com/2011/07/28/wpf-inheritance-and-datatemplates/ http://zamjad.wordpress.com/2009/12/31/applying-data-template-conditionally/
WPFでデータテンプレートの継承を使用する方法はありますか?
編集:
ベースを継承するテンプレートに Border を配置することを考えなかった理由はわかりませんが、継承するテンプレートの Border 内に StackPanel をネストすることによって (StackPanel には、ベース テンプレートのコンテンツを含む ContentPresenter と、Grid が含まれています)。追加情報があります)、すべてが非常にうまく並んでいます:
XAMeLiからの入力を使用した作業ソリューション:
<DataTemplate x:Key="ListBoxItemTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" SharedSizeGroup="LabelColumnGroup" />
<ColumnDefinition Width="150" SharedSizeGroup="LabelColumnGroup" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Bike Year:" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding BikeYear}" />
...
</Grid>
</DataTemplate>
<DataTemplate x:Key="LbxItemTemplateFullSuspension" DataType="{x:Type app:BicycleFullSuspension}" >
<Border BorderBrush="DarkRed" BorderThickness="2" Padding="5" Margin="5" Grid.IsSharedSizeScope="True" Width="500">
<StackPanel>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource ListBoxItemTemplate}" />
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="LabelColumnGroup" />
<ColumnDefinition Width="Auto" SharedSizeGroup="LabelColumnGroup" />
</Grid.ColumnDefinitions>
...
<TextBlock Grid.Row="7" Grid.Column="0" Text="Shock Type: "/>
<TextBlock Grid.Row="7" Grid.Column="1" Text="{Binding ShockType}"/>
...
</Grid>
</StackPanel>
</Border>
</DataTemplate>