我正在尝试为Silverlight3.0中的DataGridColumn创建一个AttachedProperty,但我遇到了一些问题。
下面是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行: 224位置: 112 at System.Windows.Application.LoadComponent(Object component,Uri resourceLocator) ....})
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>仅作为实验,我将这个属性(使用上面的绑定语法)附加到一个DataGrid,并检查OnHeaderPropertyChanged方法中的DataGridColumnHelper.Header属性,并且值是正确的(并且没有抛出异常)
我的理解是,AttachedProperty附加到的对象必须是DependencyProperty。通过反射器查看,DataGridColumn ( DataGridTextColumn派生自)派生自DependencyProperty。
有人能解释一下这件事吗?我正在尝试本地化我们的应用程序,但我在使用DataGrid时遇到了问题。我确信我可以在代码隐藏中做到这一点,但我正在努力避免这一点。
发布于 2009-11-05 07:39:01
克里斯,问题很简单,这是行不通的,因为DataGridTextColumn是从可视化树中“分离”出来的。您的DataGridTextColumn对象以DataGrid的Columns集合为根-请参阅间接性。因此,即使是附加的属性也不会像您期望的那样工作。现在有一种方法可以使用我称之为附加绑定的东西来实现所有这些,请参见:
http://www.orktane.com/Blog/post/2009/09/29/Introducing-nRouteToolkit-for-Silverlight-(Part-I).aspx
只需记住使用VisualTree中的内容附加绑定属性(这样保存列的网格就可以了)。
希望这能有所帮助。
发布于 2009-10-28 18:26:13
尝试使用它,我假设UserName是视图模型中的一个属性
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>我不能测试你的场景,所以我的帖子只是一个想法。可能行得通,也可能不行。
https://stackoverflow.com/questions/1632803
复制相似问题