Silverlight DataGridColumn AttachedProperties - PullRequest
0 голосов
/ 27 октября 2009

Я пытаюсь создать 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. Я уверен, что я могу сделать это в коде позади, но я пытаюсь избежать этого.

Ответы [ 2 ]

1 голос
/ 05 ноября 2009

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

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

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

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

0 голосов
/ 28 октября 2009

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

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

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

...