动态设置Silverlight DataGrid列的标题文本
时间:2020-03-06 14:54:21 来源:igfitidea点击:
<my:DataGridTemplateColumn
CanUserResize="False"
Width="150"
Header="{Binding MeetingName, Source={StaticResource LocStrings}}"
SortMemberPath="MeetingName">
</my:DataGridTemplateColumn>
我在Silverlight网格控件中有上面的列。但是由于我试图设置Header属性,它给了我XamlParser错误。有人做过吗?我想针对多种语言执行此操作。
同样,我绑定到资源的语法是正确的,因为我在网格外部的标签中尝试了它。
解决方案
我们不能绑定到标题,因为它不是FrameworkElement。我们可以通过修改标题模板来使文本动态化,如下所示:
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:dataprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
<data:DataGridTemplateColumn>
<data:DataGridTemplateColumn.HeaderStyle>
<Style TargetType="dataprimitives:DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBlock Text="{Binding MeetingName, Source={StaticResource LocStrings}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</data:DataGridTemplateColumn.HeaderStyle>
</data:DataGridTemplateColumn>
为什么不简单地在代码中设置这个:
dg1.Columns[3].Header = SomeDynamicValue;
我为绑定找到了一些解决方案。由于我们使用DataGridTemlateColumn,因此将其子类化,并添加一个名为Binding的属性,其名称为实例" HeaderBinding"。现在,我们可以从XAML绑定到该属性。接下来,应将绑定传播到标头的DataTemplate中的TextBlock。例如,我们可以使用该TextBlock的OnLoaded事件来完成此操作。
HeaderTextBlock.SetBinding(TextBlock.TextProperty, HeaderBinding);
而已。如果我们有更多的列并且只想使用一个DataTemplate,那么它会稍微复杂一些,但是想法是一样的。
要保持原始标题的视觉样式,请使用ContentTemplate而不是Template:
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="<image url goes here>"/>
</DataTemplate>
</Setter.Value>

