0

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

Вот 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 не могут быть связаны.

Этот 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 Позиция: 112] на System.Windows.Application.LoadComponent (компонент объекта, Ури resourceLocator) ....})

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

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

Только для экспериментов я приложил это свойство (с переплета синтаксиса выше) к DataGrid и проверил DataGridColumnHelper.Header свойство в методе OnHeaderPropertyChanged и значение было правильным (и исключение не было выброшено)

Это мое понимание того, что объект, который AttachedProperty присоединено к должен быть DependencyProperty. Просмотр рефлектора, DataGridColumn (из которого DataGridTextColumn происходит) происходит от DependencyProperty.

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

ответ

1

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

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

Только не забудьте прикрепить связывающие свойства, используя то, что находится в VisualTree (так Энергосистемы Держа колонка будет очень хорошо.)

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

+0

Я слежу за вашими сообщениями в наборе nRoute Toolkit, и я с нетерпением жду экспериментов с ним. Спасибо за описательный ответ. –

+0

А как насчет запуска в Silverlight? Прикрепленное свойство с привязкой к Run не работает в SIlverlight ... –

0

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

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

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

+0

Связывание Я пытаюсь использовать из файла ресурсов, потому что мы локализуем наши строки. Связывание DataGridTextColumn основано на исходном элементе Items (при условии, что мы не укажем источник, как я делал в приведенном выше примере), поэтому DataContext не совпадает с DataGrid. Спасибо –