質問

Silverlight 3.0内で DataGridColumn AttachedProperty を作成しようとしていますが、いくつかの問題があります。

AttachedPropertyは次のとおりです。

public class DataGridColumnHelper
{
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.RegisterAttached("Header", typeof(string), typeof(DataGridColumnHelper),
                                            new PropertyMetadata(OnHeaderPropertyChanged));

    private static void OnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        string header = GetHeader(d);

        var dataGridColumn = d as DataGridColumn;

        if (dataGridColumn == null)
        {
            return;
        }

        dataGridColumn.Header = GetHeader(dataGridColumn);
    }

    public static string GetHeader(DependencyObject obj)
    {
        return (string)obj.GetValue(HeaderProperty);
    }

    public static void SetHeader(DependencyObject obj, string value)
    {
        obj.SetValue(HeaderProperty, value);
    }

}

ご覧のとおり、非常にシンプルであるため、DataGridColumnクラスのHeaderプロパティをバインドできないという制限を克服しようとしています。

このXAMLは期待どおりに動作します...

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="User Name"/>

ただし、このXAMLはエラーをスローします...(具体的には{System.Windows.Markup.XamlParseException:AG_E_PARSER_PROPERTY_NOT_FOUND [Line:224 Position:112]    System.Windows.Application.LoadComponent(オブジェクトコンポーネント、Uri resourceLocator)で    ....})

<Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
                         HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"

                         Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>

実験のために、このプロパティ(上記のバインド構文を使用)を DataGrid に添付し、 OnHeaderPropertyChanged DataGridColumnHelper.Header プロパティを確認しました>メソッドと値が正しい(例外がスローされなかった)

AttachedPropertyがアタッチされるオブジェクトは DependencyProperty でなければならないことを理解しています。 Reflectorを見ると、 DataGridColumn DataGridTextColumn の派生元)は DependencyProperty から派生しています。

誰かがこれについていくつかの光を当ててください。アプリケーションをローカライズしようとしていますが、DataGridで問題が発生しています。コードビハインドでこれを実行できると確信していますが、それを回避しようとしています。

役に立ちましたか?

解決

Chris、問題は非常に簡単です。DataGridTextColumnが「切り離された」ため、これは機能しません。ビジュアルツリーから。 DataGridTextColumnオブジェクトは、DataGridのColumnsコレクションに根ざしています-インダイレクションを参照してください。したがって、添付プロパティでさえ期待どおりに機能しません。今、私がAttached Bindingsと呼んでいるものを使用して、このすべてを機能させる方法があります。参照:

http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx

VisualTreeにあるものを使用してバインディングプロパティをアタッチすることを忘れないでください(したがって、列を保持しているグリッドは問題なく動作します)。

これがお役に立てば幸いです。

他のヒント

これを使用して、UserNameがビューモデルのプロパティであると想定してください

    <Controls:DataGridTextColumn Binding="{Binding OwnerName}"                                                                         
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>

あなたのシナリオをテストすることはできませんので、私の投稿は単なるアイデアです。動作するかもしれませんが、動作しないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top