Silverlight DataGrid列附加属性

时间:2009-10-27 18:35:19

标签: silverlight-3.0 datagrid attached-properties datagridcolumn

我正在尝试在Silverlight 3.0中为AttachedProperty创建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]    在System.Windows.Application.LoadComponent(对象组件,Uri resourceLocator)    ....})

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

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

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

据我了解,AttachedProperty所附加的对象必须是DependencyProperty。通过反射器,DataGridColumnDataGridTextColumn派生的)派生自DependencyProperty

有人可以对此有所了解吗?我正在尝试本地化我们的应用程序,我遇到了DataGrid的问题。我确信我可以在代码隐藏中执行此操作,但我正在努力避免这种情况。

2 个答案:

答案 0 :(得分:1)

Chris,问题非常简单,这不起作用,因为DataGridTextColumn与Visual Tree“分离”。您的DataGridTextColumn对象植根于DataGrid的Columns集合 - 请参阅间接。因此,即使附加的属性也无法按预期工作。现在有一种方法可以使用我称之为Attached Bindings的东西来完成所有这些工作,请参阅:

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

请记住使用VisualTree中的某些内容附加绑定属性(因此持有该列的网格会很好。)

希望这有帮助。

答案 1 :(得分:0)

尝试使用此功能,我假设UserName是viewmodel中的属性

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

我无法测试你的场景所以我的帖子只是一个想法。可能会工作,可能不会。