簡體   English   中英

IMul​​tiValueConverter的DataGridTextColumn綁定不起作用

[英]DataGridTextColumn binding for IMultiValueConverter not working

我有這個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時,它將引發大量錯誤。 知道為什么會這樣嗎?

我唯一需要的是收集類型,也許有更好的方法。
實際上,我認為重要的是集合中的單項類型。

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

Rachel在這個問題上給出了很好的解釋

DataGridColumn實際上不是VisualTree的一部分,因此該類上的綁定找不到其源

她為此提供了一種解決方法,我嘗試了以下步驟,它可以正常工作。

1.創建一個新的類BindingProxy並將其添加到項目中,代碼來自此答案 ,我添加了一個try-catch來抑制Object reference not set to an instance of an object構造函數在設計時拋出Object reference not set to an instance of an object異常Object reference not set to an instance of an objectObject 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));
}

2,XAML代碼

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM