WPF C # Как я могу создавать производные стили по коду - PullRequest
1 голос
/ 24 мая 2019

Я хочу использовать ListBoxItems, которые используют различное содержимое. Для определений в xaml я использую следующий подход.

<Style TargetType="{x:Type ListBoxItem}" x:Key="ExampleBaseListBoxItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border>
                    <ContentPresenter  HorizontalAlignment="Stretch" VerticalAlignment="Center"      />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>


<Style x:Key="ExampleListBoxItem"  TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ListBoxItem Style="{DynamicResource ExampleBaseListBoxItem}">
                    <TextBox  />
                </ListBoxItem>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Это отлично работает, но у меня есть два вопроса.

  1. Это хорошая практика определения в xaml, или я должен использовать что еще?

  2. Как я могу достичь того же результата, когда стиль
    ExampleBaseListBoxItem уже существует

Пожалуйста, не беспокойтесь о TextBox. Я ищу способ сделать это, сам пример только для демонстрационных целей.

1 Ответ

1 голос
/ 24 мая 2019

Это не обычный способ подойти к таким вещам.

Вы должны определять стили и шаблоны в xaml, а не в коде.

Но.

Гораздо более привычно использовать шаблоны данных, которые соответствуют типу модели представления, используя Datatype = вместо повторного шаблона listboxitem.

Типом является модель представления строки.

Таким образом, у вас есть (скажем) класс TextBoxVM, класс DividerVM и т. Д.

Вы связываете наблюдаемую коллекцию объекта со своим источником предметов.

Шаблон TextBoxVM в текстовое поле, разделитель в разделитель и т. Д.

Первые примеры, которые у меня есть:

<DataTemplate DataType="{x:Type local:DividerVM}">
    <local:Divider />
</DataTemplate>
<DataTemplate DataType="{x:Type local:DrawCategoryVM}">
    <Grid>
        <TextBlock FontSize="{DynamicResource BigFont}" Text="{Binding Heading}" />
    </Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type local:DrawOptionVM}">
    <Grid Height="38"
          Background="Transparent"
          >

Вы можете использовать basedon для "наследования" атрибутов одного стиля в другом.

...