#c# #wpf #xaml #custom-controls
Вопрос:
У меня есть пользовательский элемент управления, основанный на классе селектора. Он отлично работает с объектами(с DisplayMemberPath), строками и даже с перечислениями.
Теперь я хотел бы расширить его функциональность для работы с «контентом xaml» по аналогии с ListBoxItem. В то время как TouchSelectorItem должен быть просто строкой.
Проблема в том, что в данном случае база.ItemsSource является нулевым и базовым.Товары.Количество равно 0. Как это решить?
public class TouchSelector : Selector, INotifyPropertyChanged
{
protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
{
base.OnItemsSourceChanged(oldValue, newValue);
this.Initialize();
}
private void Initialize()
{
//here i can cast ItemSource depending on its type
}
...
}
public class TouchSelectorItem : ContentControl
{
static TouchSelectorItem()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchSelectorItem), new FrameworkPropertyMetadata(typeof(TouchSelectorItem)));
}
public TouchSelectorItem() : base()
{
}
}
<TouchSelector>
<TouchSelectorItem>Item 1</TouchSelectorItem>
<TouchSelectorItem>Item 2</TouchSelectorItem>
<TouchSelectorItem>Item 3</TouchSelectorItem>
</TouchSelector>
#Редактировать
Ладно, я сам нашел решение.
Нет необходимости что-либо отливать, а затем решать, как это сделать. Вся эта функциональность находится в базовых классах. Так что для тех, кто новичок в кодировании пользовательских элементов управления, таких как я, все дело в шаблонах.
<Style TargetType="{x:Type local:TouchSelector}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TouchSelector}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="PART_MainGrid" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.Resources>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize}"/>
<Setter Property="FontWeight" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontWeight}"/>
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}"/>
<Setter Property="ContentTemplate" Value="{Binding ItemTemplate,RelativeSource={RelativeSource TemplatedParent}}"/>
<Setter Property="ContentTemplateSelector" Value="{Binding ItemTemplateSelector,RelativeSource={RelativeSource TemplatedParent}}"/>
</Style>
</Grid.Resources>
<ContentControl Grid.Row="1" Content="{Binding SelectedItem,RelativeSource={RelativeSource TemplatedParent}}" Foreground="{TemplateBinding Foreground}"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
And:
<Style TargetType="{x:Type local:TouchSelectorItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TouchSelectorItem}">
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>