Я создаю пользовательский набор элементов управления, который является производным от ItemsControl. Предполагается, что этот набор инструментов будет заполнен значками, поступающими из базы данных. Определение выглядит так:
public class Toolbox : ItemsControl
{
protected override DependencyObject GetContainerForItemOverride()
{
return new ToolboxItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is ToolboxItem);
}
}
Toolboxitem является производным от ContentControl.
public class ToolboxItem : ContentControl
{
static ToolboxItem()
{
FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(ToolboxItem), new FrameworkPropertyMetadata(typeof(ToolboxItem)));
}
}
Поскольку количество значков, хранящихся в базе данных, неизвестно, я хочу использовать шаблон данных:
<DataTemplate x:Key="ToolBoxTemplate">
<StackPanel>
<Image Source="{Binding Path=url}" />
</StackPanel>
</DataTemplate>
Тогда я хочу, чтобы Панель инструментов использовала шаблон.
<Toolbox x:Name="NewLibrary" ItemsSource="{Binding}" ItemTemplate="ToolBoxtemplate">
</Toolbox>
Я использую инфраструктуру сущностей ADO.NET для подключения к базе данных. Код позади:
SystemicsAnalystDBEntities db = new SystemicsAnalystDBEntities();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
NewLibrary.ItemsSource = from c in db.Components select c;
}
Однако есть проблема. Когда код выполняется, он отображает объект из базы данных (поскольку свойство ItemSource установлено для объекта из базы данных), а не изображения. Он не использует шаблон. Когда я использую источник статических изображений, он работает правильно
Я обнаружил, что мне нужно переопределить метод PrepareContainerForItemOverride. Но я не знаю, как добавить в него шаблон.
Большое спасибо за любые комментарии.
Дополнительная информация
Вот шаблон ControlTemplate для ToolboxItem:
<ControlTemplate TargetType="{x:Type s:ToolboxItem}">
<Grid>
<Rectangle Name="Border"
StrokeThickness="1"
StrokeDashArray="2"
Fill="Transparent"
SnapsToDevicePixels="true" />
<ContentPresenter Content="{TemplateBinding ContentControl.Content}"
Margin="{TemplateBinding Padding}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="true">
<Setter TargetName="Border"
Property="Stroke"
Value="Gray" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>