动态设置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>