Как определить пользовательский элемент управления на основе селектора с собственным типом элемента?

#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>