0

我正在尝试在 Silverlight 3.0AttachedProperty中为 a创建一个,DataGridColumn但我遇到了一些问题。

这是附加属性:

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}}"/>

只是为了实验,我将此属性(使用上面的绑定语法)附加到 aDataGrid并检查方法DataGridColumnHelper.Header中的属性OnHeaderPropertyChanged并且值正确(并且没有引发异常)

据我了解,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 中的内容附加绑定属性(这样保存列的 Grid 就可以了。)

希望这可以帮助。

于 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 回答