我有这个DataGridTextColumn,我试图放置一个IMultiValueConverter。
在转换器中,当我执行以下操作时,GenericDataGrid的绑定:
Console.WriteLine(values[1].GetType());
回复为MS.Internal.NamedObject
如何解决这个问题,以便它为我提供DataGrid的参考?
<DataGrid Name="GenericDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding UserCollection}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Job_Title}">
<DataGridTextColumn.Header>
<MultiBinding Converter="{StaticResource metaDataDisplayNameConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
<Binding ElementName="GenericDataGrid" />
</MultiBinding.Bindings>
</MultiBinding>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
[编辑]
这是我在制作绑定代理后所拥有的,但这对Path="Data"
有问题。输入后我得到Object reference not set to an instance of an object
。
您能看到代理绑定的问题是什么吗?
<DataGrid Name="GenericDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding UserCollection}">
<DataGrid.Resources>
<proxy:FreezableBindingProxy x:Key="proxy" Data="{Binding ElementName=GenericDataGrid}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Job_Title}">
<DataGridTextColumn.Header>
<MultiBinding Converter="{StaticResource metaDataDisplayNameConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
<Binding Source="{StaticResource proxy}" Path="Data" />
</MultiBinding.Bindings>
</MultiBinding>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
[编辑2]
另一个相关的问题。在转换器中,当我尝试获取DataGrid的ItemsSource时,它会抛出一堆错误。知道为什么会发生这种情况吗?
我唯一能追求的是收藏类型,也许还有更好的方式。
实际上,我把它当作收藏品中的单一项目类型的&#39。 #39;是重要的一个。
public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string DisplayName = "Col";
object ColumnObject = values[0];
DataGrid dg = (DataGrid)values[1];
string columnPropertyName = parameter.ToString();
var collection = dg.ItemsSource; //*****Fails here*****
Type collectionType = collection.GetType();
Type itemType = collectionType.GetGenericArguments().Single();
PropertyInfo prop = itemType.GetProperties().SingleOrDefault(p => p.Name.Equals(columnPropertyName));
//....Gets properties display name attribute here.
return DisplayName;
}
错误:
A first chance exception of type 'System.NullReferenceException' occurred in UserManagement.dll
A first chance exception of type 'System.NullReferenceException' occurred in System.Xaml.dll
A first chance exception of type 'System.NullReferenceException' occurred in PresentationFramework.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
答案 0 :(得分:1)
Rachel在这个问题上给出good explanation。
DataGridColumn实际上并不是VisualTree的一部分,因此对类的绑定无法找到它们的源
她为此提供了一种解决方法,我尝试以下步骤并且有效。
1.创建一个新类BindingProxy
并将其添加到项目中,代码来自this answer,我添加try-catch来抑制由Object reference not set to an instance of an object
引发的public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
try
{
return new BindingProxy();
}
catch
{
return null;
}
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy));
}
异常设计时的构造函数。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding ElementName=GenericDataGrid}" />
<local:MetaDataDisplayNameConverter x:Key="metaDataDisplayNameConverter" />
</Window.Resources>
<Grid>
<DataGrid Name="GenericDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding UserCollection}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Job_Title}">
<DataGridTextColumn.Header>
<MultiBinding Converter="{StaticResource metaDataDisplayNameConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{x:Static RelativeSource.Self}" />
<Binding Source="{StaticResource proxy}" Path="Data" />
</MultiBinding.Bindings>
</MultiBinding>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
2.和XAML代码
{{1}}