Прикрепленные свойства столбца Silverlight DataGrid
-
06-07-2019 - |
Вопрос
Я пытаюсь создать 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 - см. Косвенное указание. Так что даже прикрепленные свойства не будут работать так, как вы ожидаете. Теперь есть способ заставить все это работать, используя то, что я называю прикрепленными привязками, см .:
Просто не забудьте присоединить свойства привязки, используя что-то из VisualTree (так, чтобы сетка, содержащая столбец, работала бы хорошо.)
Надеюсь, это поможет.
Другие советы
Попробуйте использовать это, предполагая, что UserName является свойством вашей модели представления
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>
Я не могу проверить ваш сценарий, поэтому мой пост - всего лишь идея. Может работать, а может и нет.