Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态设置Silverlight DataGrid列的标题文本_Silverlight - Fatal编程技术网

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

动态设置Silverlight DataGrid列的标题文本,silverlight,Silverlight,我在Silverlight网格控件中有上面的列。但是它给了我一个XamlParser错误,因为我试图设置Header属性。以前有人这样做过吗?我想为多种语言做这个 另外,我绑定到资源的语法是正确的,因为我在网格外的标签中尝试了它。您不能绑定到标头,因为它不是框架元素。您可以通过修改标题模板使文本动态,如下所示: <my:DataGridTemplateColumn CanUserResize="False" Width="150"

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


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

您不能绑定到标头,因为它不是框架元素。您可以通过修改标题模板使文本动态,如下所示:

  <my:DataGridTemplateColumn 
            CanUserResize="False" 
            Width="150" 
            Header="{Binding MeetingName, Source={StaticResource LocStrings}}" 
            SortMemberPath="MeetingName"> 
  </my:DataGridTemplateColumn>
xmlns:data=“clr命名空间:System.Windows.Controls;assembly=System.Windows.Controls.data”
xmlns:dataprimitives=“clr命名空间:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data”

为什么不直接在代码中设置此选项:

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>

我找到了一些解决办法。因为您使用DataGridTemlateColumn,所以将其子类化,并添加一个名为“HeaderBinding”的绑定类型属性。现在可以从XAML绑定到该属性。接下来,您应该将绑定传播到标头的DataTemplate中的TextBlock。例如,您可以使用该文本块的onload事件来执行此操作

dg1.Columns[3].Header = SomeDynamicValue;

就这样。如果您有更多的列,并且只想使用一个DataTemplate,则会有点复杂,但想法是一样的。

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

 HeaderTextBlock.SetBinding(TextBlock.TextProperty, HeaderBinding);


发现了一个有趣的解决方案,它也适用于:

创建人

它使用一个
IValueConverter

<Setter Property="ContentTemplate">
<Setter.Value>
    <DataTemplate>
        <Image Source="<image url goes here>"/>
    </DataTemplate>
</Setter.Value>
以及
DataGridColumnHeader的样式

public class BindingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value.GetType().Name == "Binding")
        {
            ContentControl cc = new ContentControl();
            cc.SetBinding(ContentControl.ContentProperty, value as Binding);
            return cc;
        }
        else return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return null;
    }
}

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

<Grid x:Name="LayoutRoot" Background="White">
    <StackPanel>
        <TextBox Text="binding header" x:Name="tbox" />

        <data:DataGrid ItemsSource="{Binding AllPeople,Source={StaticResource folks}}" AutoGenerateColumns="False" ColumnHeaderStyle="{StaticResource ColBinding}"  >
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Binding="{Binding ID}" 

                                         Header="{Binding Text, ElementName=tbox}" />
                <data:DataGridTextColumn Binding="{Binding Name}" 

                                         Header="hello" />
            </data:DataGrid.Columns>
        </data:DataGrid>
    </StackPanel>

</Grid>
然后,在XAML中:

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;
    }
}

在代码中设置值似乎要简单得多,如上所述:

<data:DataGridTextColumn util:DataGridColumnHelper.HeaderBinding="{Binding MeetingName, Source={StaticResource LocStrings}}" />
避免使用Setter属性语法,在我的例子中,这似乎会弄乱样式,即使我尝试使用ContentTemplate和Template

我犯了一个错误,那就是最好使用
dg1.Columns[3]。标题
表示法,而不是尝试引用命名列


我已经命名了我的一个列,并试图在代码中引用它,但得到了null异常。使用Columns[index]方法效果很好,我可以根据本地化资源为标题分配一个文本字符串。

请注意,在RobSiklos提供的解决方案中,如果您计划传递类似的相对资源,则Source{staticResource…}是关键

dg1.Columns[3].Header = SomeDynamicValue;

它可能不起作用

如何保持原始标题的视觉样式?谢谢您的回答。你帮了我很多,这也帮了我。我能够以基本相同的方式将其应用于DataGridTextColumn。我使用了同样提到的ContentTemplate建议。在这个问题中,RobSiklos提供的解决方案也保持了视觉风格。我认为公认的答案应该是RobSiklos的答案。不仅因为保留了视觉样式,还因为提供了一个简单的实现,可以保留“样式”和“代码”的概念分离。似乎无法在文本块的DataTemplate中使用绑定:替换示例中的图像。这无助于在我的经验中保持视觉样式。此方法绝对是可行的,并且它确实保持了视觉样式。如果重新模板化整个标题,它将变成一个白色框,包含您在其中放置的内容。但是,如果使用ContentTemplate,则会保留默认标题样式的现有背景。此外,如果将绑定的源指定为某个StaticResource(如原始文章中所述),则它会工作。与接受的解决方案不同,此解决方案可以执行接受的解决方案所执行的操作,并保留原始样式。它对我有用+这对我也有用。这绝对是完美的,也是我想要的:风格和代码背后,作为概念分开,用XAML分开。非常感谢,这应该是公认的解决方案。您更喜欢这个解决方案,因为它保留了责任和关注点的分离。
dg1.Columns[3].Header = SomeDynamicValue;
Binding DataContext.SelectedHistoryTypeItem,RelativeSource={RelativeSource AncestorType=sdk:DataGrid},