Как создать стиль на основе стиля DataGrid по умолчанию?

#c# #wpf #datagrid #styles

#c# #wpf #datagrid #стили

Вопрос:

У меня есть пользовательский элемент управления, который расширяется DataGrid . Это называется ExtendedDataGrid . Я хочу предоставить стиль для, ExtendedDataGrid который совпадает со DataGrid стилем s, за исключением того, что он изменяет шаблон. Я пробовал что-то вроде этого:

 <Style TargetType="{x:Type MyControls:ExtendedDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
    <Setter Property="Template">
    ...
    </Setter>
</Style>
  

Но в нем говорится, что ресурс не найден.

Поэтому я пытаюсь:

 <Style TargetType="{x:Type MyControls:ExtendedDataGrid}" BasedOn="{StaticResource {ComponentResourceKey ResourceId=DataGridStyle, TypeInTargetAssembly={x:Type DataGrid}}}">
    <Setter Property="Template">
    ...
    </Setter>
</Style>
  

Но это также не работает… Итак, что мне делать?

Ответ №1:

Что ж, загадка решена 🙂

Мой первый приведенный выше код действительно работает:

 <Style TargetType="{x:Type MyControls:ExtendedDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
    <Setter Property="Template">
    ...
    </Setter>
</Style>
  

Я думал, что это не работает, потому что VS (или Resharper) показал ошибку в моем коде, в которой говорится, что ресурс не найден… Ошибка в VS (или Resharper):(

Комментарии:

1. -.- так и думал, вы случайно не используете конструктор?

2. Да, я использую его, почему вы спрашиваете?

3. Поскольку это кусок дерьма, который никто не должен использовать, если у него нет действительно веского оправдания (незнание того, как писать XAML, не является таковым : P), он часто утверждает, что что-то не работает, хотя на самом деле это так.

4. Моим оправданием было бы (в дополнение к тому факту, что я не знаю, как писать XAML), что мне хотелось бы посмотреть, как на самом деле выглядит графический интерфейс, который я разрабатываю.

5. @H.B. Но вот один голос за ваш комментарий, вы правы 🙂

Ответ №2:

Если вы создаете стиль со свойством TargetType и основываете его на другом стиле, который также определяет свойство TargetType, целевой тип производного стиля должен совпадать с типом базового стиля или быть производным от него.

Ваша сетка наследуется от DataGrid, верно?

Комментарии:

1. Было интересно, что бы это могло быть, если не это, поскольку, как вы заметили, это работает.