我正在尝试为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是“分离的”来自Visual Tree。您的DataGridTextColumn对象植根于DataGrid的Columns集合 - 请参阅间接。因此,即使附加的属性也无法按预期工作。现在有一种方法可以使用我称之为Attached Bindings的东西来完成所有这些工作,请参阅:

http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(第一部分-I)的.aspx

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

希望这有帮助。

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top