Вопрос

Я пытаюсь создать AttachedProperty для DataGridColumn в Silverlight 3.0, и у меня возникли некоторые проблемы.

Вот свойство 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);
    }

}

Как вы видите, это действительно просто, я пытаюсь преодолеть ограничение на то, что свойство Header в классе DataGridColumn не может быть связано.

Этот 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 [Строка: 224, Позиция: 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 . При просмотре Reflector DataGridColumn (из которого происходит DataGridTextColumn ) происходит от DependencyProperty .

Кто-нибудь может пролить свет на это? Я пытаюсь локализовать наше приложение, и у меня возникают проблемы с DataGrid. Я уверен, что могу сделать это в коде позади, но я пытаюсь избежать этого.

Это было полезно?

Решение

Крис, проблема очень проста, это не сработает, потому что DataGridTextColumn " отсоединен " из визуального дерева. Ваш объект DataGridTextColumn внедрен в коллекцию Columns DataGrid - см. Косвенное указание. Так что даже прикрепленные свойства не будут работать так, как вы ожидаете. Теперь есть способ заставить все это работать, используя то, что я называю прикрепленными привязками, см .:

http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight- (Часть-I) .aspx

Просто не забудьте присоединить свойства привязки, используя что-то из VisualTree (так, чтобы сетка, содержащая столбец, работала бы хорошо.)

Надеюсь, это поможет.

Другие советы

Попробуйте использовать это, предполагая, что UserName является свойством вашей модели представления

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

Я не могу проверить ваш сценарий, поэтому мой пост - всего лишь идея. Может работать, а может и нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top