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

Silverlight グリッド コントロールに上記の列があります。しかし、Header プロパティを設定しようとしている方法が原因で、XamlParser エラーが発生しています。誰もこれを以前にやったことがありますか?複数の言語でこれを行いたい。

また、グリッド外のラベルで試したので、リソースへのバインディングの構文は正しいです。

4

8 に答える 8

28

FrameworkElement ではないため、Header にバインドできません。次のようにヘッダー テンプレートを変更することで、テキストを動的にすることができます。

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>
于 2008-09-30T05:38:58.570 に答える
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;
    }
}

次に、XAMLで:

<data:DataGridTextColumn util:DataGridColumnHelper.HeaderBinding="{Binding MeetingName, Source={StaticResource LocStrings}}" />
于 2011-04-29T15:07:04.263 に答える
11

元のヘッダーのビジュアル スタイルを維持するには、Template の代わりに ContentTemplate を使用します。

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

于 2010-09-02T13:08:02.700 に答える
2

wpflocalizeaddin.codeplex.comでも機能する興味深い回避策を見つけました。

作成者Slyi

を使用します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;
    }
}

そして、そのためのスタイル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>

お気に入りのバインディング構文をHeader属性に保持できるように

<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

于 2011-03-09T13:19:09.820 に答える
2

上記のように、コードで値を設定する方がはるかに簡単に思えます。

dg1.Columns[3].Header = SomeDynamicValue;

Template と同様に ContentTemplate を使用しようとしたにもかかわらず、私の場合はスタイリングを台無しにしているように見えた Setter Property 構文の使用を避けます。

私が誤解した点の 1 つは dg1.Columns[3].Header、名前付きの列を参照しようとするよりも、表記法を使用するほうがよいということです。

列の 1 つに名前を付けて、コードでそれを参照しようとしましたが、null 例外が発生しました。Columns[index] メソッドの使用はうまく機能し、ローカリゼーション リソースに基づいてヘッダーにテキスト文字列を割り当てることができました。

于 2011-11-11T12:04:56.560 に答える
1

RobSiklos が提供するソリューションでは、次のように RelativeSource を渡す予定がある場合は、ソース {staticResource...} がキーであることに注意してください。

Binding DataContext.SelectedHistoryTypeItem,RelativeSource={RelativeSource AncestorType=sdk:DataGrid},

うまくいかないかもしれません

于 2013-08-16T09:19:11.153 に答える
1

これをコードで単純に設定してみませんか。

dg1.Columns[3].Header = SomeDynamicValue;
于 2010-02-05T16:38:22.153 に答える
0

バインディングの解決策がありました。DataGridTemlateColumnを使用するので、それをサブクラス化し、たとえば「HeaderBinding」という名前のBindingタイプのプロパティを追加します。これで、XAMLからそのプロパティにバインドできます。次に、ヘッダーのDataTemplateでTextBlockへのバインディングを伝播する必要があります。たとえば、そのTextBlockのOnLoadedイベントでそれを行うことができます。

 HeaderTextBlock.SetBinding(TextBlock.TextProperty, HeaderBinding);

それでおしまい。より多くの列があり、1つのDataTemplateのみを使用する場合は、少し複雑になりますが、考え方は同じです。

于 2010-04-06T12:42:40.760 に答える