我正在尝试在Silverlight 3.0中为AttachedProperty
创建DataGridColumn
,但我遇到了一些问题。
这是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
并检查DataGridColumnHelper.Header
方法中的OnHeaderPropertyChanged
属性,并且值是正确的(并且异常没被抛出)
据我了解,AttachedProperty所附加的对象必须是DependencyProperty
。通过反射器,DataGridColumn
(DataGridTextColumn
派生的)派生自DependencyProperty
。
有人可以对此有所了解吗?我正在尝试本地化我们的应用程序,我遇到了DataGrid的问题。我确信我可以在代码隐藏中执行此操作,但我正在努力避免这种情况。
答案 0 :(得分:1)
Chris,问题非常简单,这不起作用,因为DataGridTextColumn与Visual Tree“分离”。您的DataGridTextColumn对象植根于DataGrid的Columns集合 - 请参阅间接。因此,即使附加的属性也无法按预期工作。现在有一种方法可以使用我称之为Attached Bindings的东西来完成所有这些工作,请参阅:
http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx
请记住使用VisualTree中的某些内容附加绑定属性(因此持有该列的网格会很好。)
希望这有帮助。
答案 1 :(得分:0)
尝试使用此功能,我假设UserName是viewmodel中的属性
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>
我无法测试你的场景所以我的帖子只是一个想法。可能会工作,可能不会。