Как «внедрить» стиль в DataTemplate - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь отделить шаблоны данных от стилей в моем коде. Я использую DataTemplate для определения, например, что данные должны отображаться в виде двух кнопок, и я использую стили для определения, например, что фон этих кнопок должен быть зеленым.

То, чего я пытаюсь добиться, это наличие DataTemplate определяется в одном файле и использует его в нескольких UserControl с, где стиль происходит от UserControl s.

Допустим, у меня есть следующий стиль в Resources из UserControl:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="Green"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

Другой UserControl может иметь что-то похожее с разными цветами.

Тогда у меня есть ContentControl в этом UserControl, который будет иметь некоторую модель представления и некоторый DataTemplate:

<ContentControl Content="{Binding SelectedViewModel}"
                ContentTemplate="{Binding SelectedDataTemplate}"/> 

DataTemplate может быть чем-то простым:

<DataTemplate x:Key="TwoButtonsTemplate">
    <StackPanel>
        <Button Content="One"/>
        <Button Content="Two"/>
    </StackPanel>
</DataTemplate>

Я бы хотел, чтобы две кнопки имели ButtonStyle из UserControl.Resources без прямой ссылки на него. (Таким образом, DataTemplate может быть из другого файла или иметь возможность использовать DataTemplate в аналогичном контексте с другим стилем UserControl).

Я попытался изменить TargetType из ButtonStyle на ContentControl, назначьте стиль для ContentControl и установите Foreground="{TemplatedParent Foreground}" на Button s, но таким образом оба Foreground изменятся, когда какой-либо из них (то есть сам ContentControl) будет зависать.

Есть ли способ "наследовать" стиль в DataTemplate или "вставлять" стиль из UserControl?

PS Я понимаю, если я перенесу стиль в отдельный файл и ссылку что в файле DataTemplate я могу просто использовать его как StaticResource, но это свяжет DataTemplate с указанным стилем c, и я не смогу повторно использовать его с другими стилями.

1 Ответ

1 голос
/ 10 апреля 2020

попробуйте DynamicResource:

<DataTemplate x:Key="TwoButtonsTemplate">
    <StackPanel>
        <Button Content="One" Style="{DynamicResource ButtonStyle}"/>
        <Button Content="Two" Style="{DynamicResource ButtonStyle}"/>
    </StackPanel>
</DataTemplate>

, когда создается экземпляр TwoButtonsTemplate в UserControl, который объявляет ресурс ButtonStyle, этот ресурс будет найден и применен к кнопкам.

...