Datagrid有多个bug;
1,不支持DynamicResource的东西
2, 在Column隐藏后再显示, ColumnHeader的Tag或者DataContext为null。
解决办法:
用StaticResource ,如下面的
StaticResource
DGC_ContentTemplate;
用DataGridColumnHeader的Column,来取得上层的datacontext。如,
ItemsSource
="{
Binding
Path
=Column.Tag,
Converter
={
StaticResource
DebugConverter
},
Mode
=OneWay,
RelativeSource
={
RelativeSource
FindAncestor
,
AncestorType
={
x
:
Type
DataGridColumnHeader
}}}"
private void InitDataGridBinding (DataGridColumnEx col, string path)
{
if
(
null
==
col
||
String
.
IsNullOrWhiteSpace
(
path
) ||
null
==
col
.
Header
)
{
return
;
}
Binding
binding
=
new
Binding
();
binding
.
Mode
=
BindingMode
.
OneWay
;
binding
.
RelativeSource
=
new
RelativeSource
(
RelativeSourceMode
.
Self
);
binding
.
Converter
=
new
BoolToVisibilityConverter
();
binding
.
Path
=
new
PropertyPath
(
"(FrameworkElement.DataContext).PACfgVM."
+
path
+
".CfgInfo["
+
PAAttachedProperty
.
GetName
(
col
) +
"].IsVisiable"
);
BindingOperations
.
SetBinding
(
col
,
DataGridColumnEx
.
VisibilityProperty
,
binding
);
//{for combobox binding in columnHeader
col
.
Tag
=
PAAttachedProperty
.
GetTag
(
col
);
DependencyPropertyDescriptor
dpd
=
DependencyPropertyDescriptor
.
FromProperty
(
DataGridColumnEx
.
VisibilityProperty
,
typeof
(
DataGridColumnEx
));
if
(
dpd
!=
null
)
{
dpd
.
AddValueChanged
(
col
,
delegate
{
//
InitDataGridColumnHeader
(
col
,
GetDataGridParent
(
col
));
});
}
//}
}
<DataTemplate x :Key="DGC_ContentTemplate">
<
TextBlock
TextWrapping
="Wrap"
Text
="{
Binding
}"
MinWidth
="20"/>
</
DataTemplate
>
<
Style
x
:
Key
="DataGridColumnHeaderStyle_ComboBox"
TargetType
="{
x
:
Type
DataGridColumnHeader
}">
<
Setter
Property
="ContentTemplate"
Value
="{
StaticResource
DGC_ContentTemplate
}"/>
<
Setter
Property
="VerticalContentAlignment"
Value
="Center"/>
<
Setter
Property
="Template">
<
Setter.Value
>
<
ControlTemplate
TargetType
="{
x
:
Type
DataGridColumnHeader
}">
<
Grid
>
<
StackPanel
Orientation
="Vertical"
d
:
LayoutOverrides
="Height"
Margin
="10">
<
Label
Foreground
="Black"
HorizontalContentAlignment
="Left"
Content
="{
TemplateBinding
Content
}"/>
<!--<ComboBox Margin="0,10,0,0" ItemsSource="{Binding (FrameworkElement.Column.).TimeSearchGroup, Converter={StaticResource DebugConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>-->
<!--<ComboBox Margin="0,10,0,0"
ItemsSource="{Binding Path=Tag, Converter={StaticResource DebugConverter}, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridColumnHeader}}}"></ComboBox>-->
<
ComboBox
Margin
="0,10,0,0"
ItemsSource
="{
Binding
Path
=Column.Tag,
Converter
={
StaticResource
DebugConverter
},
Mode
=OneWay,
RelativeSource
={
RelativeSource
FindAncestor
,
AncestorType
={
x
:
Type
DataGridColumnHeader
}}}"></
ComboBox
>
</
StackPanel
>
<
Thumb
x
:
Name
="PART_LeftHeaderGripper"
HorizontalAlignment
="Left"
Style
="{
StaticResource
ColumnHeaderGripperStyle
}"/>
<
Thumb
x
:
Name
="PART_RightHeaderGripper"
HorizontalAlignment
="Right"
Style
="{
StaticResource
ColumnHeaderGripperStyle
}"/>
</
Grid
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
<
EventSetter
Event
="Selector.SelectionChanged"
Handler
="ComboBox_SelectionChanged"/>
</
Style
>