29 votes

Définition dynamique du texte d'en-tête d'une colonne Silverlight DataGrid

   <my:DataGridTemplateColumn 
            CanUserResize="False" 
            Width="150" 
            Header="{Binding MeetingName, Source={StaticResource LocStrings}}" 
            SortMemberPath="MeetingName"> 
  </my:DataGridTemplateColumn>
 

J'ai la colonne ci-dessus dans un contrôle de grille Silverlight. Mais cela me donne une erreur XamlParser en raison de la façon dont j'essaie de définir la propriété Header. Quelqu'un a-t-il déjà fait cela? Je veux le faire pour plusieurs langues.

De plus, ma syntaxe pour la liaison à une ressource est correcte car je l'ai essayée dans une étiquette en dehors de la grille.

28voto

Adam Kinney Points 871

Vous ne pouvez pas lier à l'en-tête car ce n'est pas un FrameworkElement. Vous pouvez rendre le texte dynamique en modifiant le modèle d'en-tête comme ceci:

 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>
 

14voto

RobSiklos Points 3324

Ma solution de contournement consistait à utiliser une propriété jointe pour définir automatiquement la liaison:

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

Ensuite, dans le XAML:

 <data:DataGridTextColumn util:DataGridColumnHelper.HeaderBinding="{Binding MeetingName, Source={StaticResource LocStrings}}" />
 

11voto

Lars Holm Jensen Points 699

Pour conserver le style visuel de l'en-tête d'origine, utilisez ContentTemplate au lieu de Template:

 <Setter Property="ContentTemplate">
<Setter.Value>
    <DataTemplate>
        <Image Source="<image url goes here>"/>
    </DataTemplate>
</Setter.Value>
 

2voto

Rudi Points 1541

Trouvé une intéressante solution qui fonctionne aussi avec la wpflocalizeaddin.codeplex.com:

Créé par Slyi

Il utilise un IValueConverter:

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

Et un style pour l' DataGridColumnHeader

<UserControl.Resources>
    <local:BindingConverter x:Key="BindCon"/>
    <Style x:Key="ColBinding" TargetType="dataprimitives:DataGridColumnHeader" >
        <Setter Property="ContentTemplate" >
            <Setter.Value>
                <DataTemplate>
                    <ContentPresenter Content="{Binding Converter={StaticResource BindCon}}"  />
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

de sorte que vous pouvez garder votre favori syntaxe de liaison sur l' Header d'attribut

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

http://cid-289eaf995528b9fd.skydrive.live.com/self.aspx/Public/HeaderBinding.zip

2voto

Steve Points 39

Il semble beaucoup plus simple pour définir la valeur dans le code, comme mentionné ci-dessus:

dg1.Columns[3].Header = SomeDynamicValue;

Évite d'utiliser le Setter de la Propriété de la syntaxe, ce qui dans mon cas semble gâcher le style, même si je l'ai fait essayer à l'aide de ContentTemplate ainsi que Modèle.

Un moment, j'ai glissé vers le haut, c'est que c'est mieux d'utiliser la dg1.Columns[3].Header notation plutôt que d'essayer de faire référence à une colonne nommée.

Je l'avait nommé un de mes colonnes et essayé de référence que dans le code, mais suis nulle exceptions. En utilisant les Colonnes[index] méthode a bien fonctionné, et j'ai pu affecter l'en-Tête d'une chaîne de texte basé sur la localisation des ressources.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X