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