此文可解决: 重写控件时,给控件加入子控件或父控件的样式切换问题。 很灵活的可以根据不同内容显示不同样式
子控件作用在:
<DataTemplate x:Key="ColmunHeader1"> <DockPanel Background="Transparent"> <!-- The control to host the filter UI for this column --> <controls:dgDataGrid DockPanel.Dock="Right" /> <ContentPresenter x:Name="PART_Content" Content="{Binding}" SnapsToDevicePixels="{Binding SnapsToDevicePixels, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridColumnHeader}}" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridColumnHeader}}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridColumnHeader}}" /> </DockPanel> </DataTemplate>
如下样式:
<ControlTemplate x:Key="DataGridCheckBoxColumn1"> <Grid> <CheckBox /> </Grid> </ControlTemplate>
<ControlTemplate x:Key="DataGridTextBoxColumn1"> <Grid> <TextBox/>
</Grid>
</ControlTemplate>
然后在子控件类的loaded事件中加入:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace WpfApp1.Controls
{
public class dgDataGrid : Control
{
public DataGridColumnHeader ColumnHeader { get; set; }
public dgDataGrid()
{
this.Loaded += (s, e) =>
{
ColumnHeader = this.FindAncestorOrSelf<DataGridColumnHeader>();
var value = ColumnHeader.Column.GetType();
if (value == typeof(DataGridTextColumn))
{
this.Template = this.FindResource("DataGridTextColumn1") as ControlTemplate;
}
else
{
this.Template = this.FindResource("DataGridCheckBoxColumn1") as ControlTemplate;
}
};
}
}
}