Reputation: 51
I have lots of ContentControl objects and I need a border around a few of them, not all. I was able to get it working with the below code:
<ContentControl Margin="2" Grid.Row="0" Grid.Column="1" BorderThickness="5" BorderBrush="Beige">
<!-- ContentControl.Template to get the border -->
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
<ContentPresenter
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Cursor="{TemplateBinding Cursor}"
Margin="{TemplateBinding Padding}" />
</Border>
</ControlTemplate>
</ContentControl.Template>
<StackPanel>
<Label Content="Paid" HorizontalAlignment="Right" />
<Label Content="{Binding ReceivedAmount}" HorizontalAlignment="Right" />
</StackPanel>
</ContentControl>
I want to move the entire ContentTemplate section to an other resource file and merge them. I added a new resource file and moved the below part of code to it.
<ControlTemplate TargetType="ContentControl" x:Key="BalanceAmountControls">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
<ContentPresenter
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Cursor="{TemplateBinding Cursor}"
Margin="{TemplateBinding Padding}" />
</Border>
</ControlTemplate>
When I try to change the actual ContentControl code to this, I get an error saying
"An object of type System.Windows.Controls.ControlTemplate cannot be applied to a property that expects the type System.Windows.Controls.DataTemplateSelector"
<!-- Balance amount -->
<ContentControl Margin="2" Grid.Row="0" Grid.Column="2" BorderThickness="5" BorderBrush="Beige" ContentTemplateSelector="{StaticResource BalanceAmountControls}">
<!-- ContentControl.Template to get the border -->
<StackPanel>
<Label Content="Balance" HorizontalAlignment="Right" />
<Label Content="{Binding BalanceAmount}" HorizontalAlignment="Right" />
</StackPanel>
</ContentControl>
How do I resolve this error?
Upvotes: 0
Views: 755
Reputation: 28948
An object of type ControlTemplate cannot be applied to a property that expects the type DataTemplateSelector
This error message is very explicit. You are assigning a ControlTemplate
to aContentControl.DataTemplateSelector
. Type mismatch. You are assigning
<ControlTemplate TargetType="ContentControl" x:Key="BalanceAmountControls">
to
<ContentControl ContentTemplateSelector="{StaticResource BalanceAmountControls}">
.
Solution:
You need to implement your own DataTemplateSelector
:
public class ContentControlDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Task)
{
if (// your condition)
return
element.FindResource("BalanceAmountControls") as DataTemplate;
else
return
element.FindResource("NonBalanceAmountControls") as DataTemplate;
}
return null;
}
}
Apply the template selector:
<ContentControl ContentTemplateSelector="{StaticResource ContentControlDataTemplateSelector}" />
Now you need to create the proper DataTemplate
resources which describe the individual visual appearance of the data that you have to bind to the ContentControl.Content
property.
Upvotes: 1