我猜我有一个简单的问题。基本上,我有一个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"/>
但是,如果我想让fe更改位置(在网格中,我希望它是Grid.ColumnSpan="2"
而不是Grid.ColumnSpan="1") I can't do that, cuz the
DataGrid is in my control, and my control isn't derived from
DataGrid`本身(我想,如果它会被派生,那么我可以像在普通班级上那样做,对吗?)
所以最后我的问题是:有没有办法在我自己的XAML
中从标准UserControl
控件继承并以不同的方式设置样式(例如在这里,在我的代码中,我会省略{ {1}}标签,然后将其参数放在<DataGrid>
标签中,而其他类似<UserControl>
的东西将放在DataGrid.ColumnHeaderStyle
的正下方)?
答案 0 :(得分:1)
创建自定义DataGrid
而不是自定义UserControl
,即从XAML文件(<UserControl>
)中删除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();
}
}