Я пытаюсь отделить шаблоны данных от стилей в моем коде. Я использую 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, и я не смогу повторно использовать его с другими стилями.