0

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

ここに 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] at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) ....} )

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

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

実験のために、このプロパティを (上記のバインディング構文で) にアタッチし、メソッドでプロパティDataGridをチェックしたところ、値は正しかった (そして例外はスローされなかった)DataGridColumnHelper.HeaderOnHeaderPropertyChanged

AttachedProperty がアタッチされているオブジェクトはDependencyProperty. Reflector を調べると、DataGridColumn(DataGridTextColumn派生元) は から派生しDependencyPropertyます。

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

4

2 に答える 2

1

クリス、問題は非常に単純です。DataGridTextColumn がビジュアル ツリーから「切り離されている」ため、これは機能しません。DataGridTextColumn オブジェクトは DataGrid の Columns コレクションをルートとしています - 間接参照を参照してください。したがって、添付されたプロパティでさえ、期待どおりに機能しません。今、私がアタッチされたバインディングと呼んでいるものを使用して、このすべての作業を行う方法があります。以下を参照してください。

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

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

お役に立てれば。

于 2009-11-04T23:39:01.047 に答える
0

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

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

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

于 2009-10-28T10:26:13.417 に答える