Думаю, у меня простая проблема. В основном у меня есть приложение WPF, в котором я много использую управление DataGrid. И каждый раз я оформляю его одинаково (различаются только данные, количество строк и столбцов). Поэтому я подумал о создании своего собственного элемента управления DataGridMatrix, который отвечал бы моим потребностям.
Код, который я написал для него, выглядит следующим образом:
<UserControl x:Class = "StateMachines.UI.Controls.DataGridMatrix"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable = "d">
<DataGrid Width = "450"
RenderTransformOrigin = "0.657,1.249"
ItemsSource = "{Binding Path=Logic.DefaultView}" ColumnWidth = "*"
CanUserReorderColumns = "False"
CanUserResizeColumns = "False" CanUserAddRows = "False" CanUserSortColumns = "False"
CanUserResizeRows = "False" Grid.ColumnSpan = "1">
<DataGrid.ColumnHeaderStyle>
<Style TargetType = "{x:Type DataGridColumnHeader}"
BasedOn = "{StaticResource MetroDataGridColumnHeader}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.RowHeaderStyle>
<Style TargetType = "{x:Type DataGridRowHeader}"
BasedOn = "{StaticResource MetroDataGridRowHeader}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType = "{x:Type DataGridCell}" BasedOn = "{StaticResource MetroDataGridCell}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
<Style.Triggers>
<DataTrigger
Binding = "{Binding RelativeSource = {x:Static RelativeSource.Self}, Path=Column.DisplayIndex}"
Value = "0">
<Setter Property = "Block.FontWeight" Value = "Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
</UserControl>
Как видите, я только оформляю его, я не помещаю в него никаких данных (в XAML). Проблема в том, что я, конечно, могу поместить этот элемент управления в свой MainWindow.xaml следующим образом:
<controls:DataGridMatrix x:Name = "DataGridTransition"/>
Но затем, если я хочу изменить положение (в сетке, например, я бы хотел, чтобы это был Grid.ColumnSpan = "2" вместо самого Grid.ColumnSpan = "1") I can't do that, cuz theDataGridis in my control, and my control isn't derived fromDataGrid` (я думаю, если бы он был получен, то я мог бы сделать это, как в обычных классах, верно?) ).
Итак, наконец, мой вопрос: есть ли способ унаследовать от стандартного элемента управления XAML в моем собственном UserControl и просто стилизовать его по-другому (как здесь, в моем коде я бы пропустил тег <DataGrid>, и я бы поместил его аргументы в тег <UserControl> + другие вещи, такие как DataGrid.ColumnHeaderStyle, можно было бы разместить прямо под <UserControl>)?
Создайте настраиваемый DataGrid вместо настраиваемого UserControl.
@LupuSilviu Итак, если бы я хотел иметь 3 DataGrid, я бы просто сделал 3x <DataGrid></DataGrid>, а затем где-то над ними я определил свой стиль, который влияет на все DataGrid? @ mm8 -> Как мне его создать? Я имею ввиду Add->New Item и что дальше?
@Frynio: Просто удалите корневой элемент <UserControl> и унаследуйте частичный класс от DataGrid. Смотрите мой ответ.





Создайте собственный DataGrid вместо пользовательского UserControl, то есть удалите корневой элемент <UserControl> из вашего файла XAML (DataGridMatrix.xaml), чтобы он выглядел так:
<DataGrid x:Class = "WpfApp2.DataGridMatrix"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Width = "450"
RenderTransformOrigin = "0.657,1.249"
ItemsSource = "{Binding Path=Logic.DefaultView}" ColumnWidth = "*"
CanUserReorderColumns = "False"
CanUserResizeColumns = "False" CanUserAddRows = "False" CanUserSortColumns = "False"
CanUserResizeRows = "False" Grid.ColumnSpan = "1">
<DataGrid.ColumnHeaderStyle>
<Style TargetType = "{x:Type DataGridColumnHeader}"
BasedOn = "{StaticResource MetroDataGridColumnHeader}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.RowHeaderStyle>
<Style TargetType = "{x:Type DataGridRowHeader}"
BasedOn = "{StaticResource MetroDataGridRowHeader}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType = "{x:Type DataGridCell}" BasedOn = "{StaticResource MetroDataGridCell}">
<Setter Property = "HorizontalContentAlignment" Value = "Center" />
<Style.Triggers>
<DataTrigger
Binding = "{Binding RelativeSource = {x:Static RelativeSource.Self}, Path=Column.DisplayIndex}"
Value = "0">
<Setter Property = "Block.FontWeight" Value = "Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
... и измените базовый класс в коде программной части (DataGridMatrix.xaml.cs) с UserControl на DataGrid:
public partial class DataGridMatrix : DataGrid
{
public DataGridMatrix()
{
InitializeComponent();
}
}
Ммм. А если у меня нет файла *.xaml.cs? Потому что я сделал Add->New Item->WPF Control? Стоит ли добавлять вручную?
У вас должен быть файл DataGridMatrix.xaml.cs, если у вас есть атрибут x: Class в вашем XAML ... который есть в опубликованном вами образце разметки.
Боже, я такой тупой. Не заметил стрелки возле имени файла. В любом случае, спасибо, я думаю, это сработает для меня, я не могу проверить, знаю, потому что я далеко от своего компьютера, но я определенно приму ваш ответ. Еще раз спасибо
Вместо создания настраиваемого элемента управления вы можете попробовать создать стиль на основе DataGrid. Таким образом, вы можете использовать стиль и при этом изменять некоторые свойства сетки.