动态设置Silverlight DataGrid列的标题文本

Kyl*_*yle 29 silverlight

  <my:DataGridTemplateColumn 
            CanUserResize="False" 
            Width="150" 
            Header="{Binding MeetingName, Source={StaticResource LocStrings}}" 
            SortMemberPath="MeetingName"> 
  </my:DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

我在Silverlight网格控件中有上面的列.但它给我一个XamlParser错误,因为我试图设置Header属性.有没有人这样做过?我想为多种语言做这件事.

我的绑定资源的语法也是正确的,因为我在网格外的标签中尝试了它.

小智 28

您不能绑定到标头,因为它不是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>
Run Code Online (Sandbox Code Playgroud)

  • 你如何保持原始标题的视觉样式? (12认同)
  • 在这个问题中,RobSiklos提供的解决方案也保持了视觉样式. (2认同)
  • 我认为接受的答案应该是RobSiklos的答案.不仅因为保持了视觉样式,而且因为提供了一种简单的实现方式,可以将"样式"和"代码"的概念分开. (2认同)

Rob*_*los 14

我的解决方法是使用附加属性自动设置绑定:

public static class DataGridColumnHelper
{
    public static readonly DependencyProperty HeaderBindingProperty = DependencyProperty.RegisterAttached(
        "HeaderBinding",
        typeof(object),
        typeof(DataGridColumnHelper),
        new PropertyMetadata(null, DataGridColumnHelper.HeaderBinding_PropertyChanged));

    public static object GetHeaderBinding(DependencyObject source)
    {
        return (object)source.GetValue(DataGridColumnHelper.HeaderBindingProperty);
    }

    public static void SetHeaderBinding(DependencyObject target, object value)
    {
        target.SetValue(DataGridColumnHelper.HeaderBindingProperty, value);
    }

    private static void HeaderBinding_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        DataGridColumn column = d as DataGridColumn;

        if (column == null) { return; }

        column.Header = e.NewValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在XAML中:

<data:DataGridTextColumn util:DataGridColumnHelper.HeaderBinding="{Binding MeetingName, Source={StaticResource LocStrings}}" />
Run Code Online (Sandbox Code Playgroud)


Lar*_*sen 11

要保持原始标题的视觉样式,请使用ContentTemplate而不是Template:

<Setter Property="ContentTemplate">
<Setter.Value>
    <DataTemplate>
        <Image Source="<image url goes here>"/>
    </DataTemplate>
</Setter.Value>
Run Code Online (Sandbox Code Playgroud)

  • 这种方法绝对是可行的方法,它保留了视觉样式.如果你重新模板整个标题,它会变成一个白色的框,包含你放在那里的任何东西.但是,如果使用ContentTemplate,则会保留默认标题样式的现有背景. (5认同)