DataGridTextColumn绑定IMultiValueConverter无法正常工作

时间:2015-01-21 22:56:02

标签: c# wpf imultivalueconverter

我有这个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>

enter image description here

[编辑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

1 个答案:

答案 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}}