C# 将可空值的集合绑定到DataGrid

C# 将可空值的集合绑定到DataGrid,c#,wpf,data-binding,datagrid,nullable,C#,Wpf,Data Binding,Datagrid,Nullable,我正在尝试将一组可为null的值(Items=newobservetecollection{})绑定到数据网格。下面给出了错误 值不能为null。 参数名称:key <DataGrid Name="pointList" ItemsSource="{Binding Path=Value.Items,Converter={l:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >

我正在尝试将一组可为null的值(
Items=newobservetecollection{}
)绑定到数据网格。下面给出了错误

值不能为null。 参数名称:key

            <DataGrid Name="pointList" ItemsSource="{Binding Path=Value.Items,Converter={l:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                </DataGrid.Columns>
            </DataGrid>

当我尝试使用转换器时,我得到以下错误 双向绑定需要路径或XPath

            <DataGrid Name="pointList" ItemsSource="{Binding Path=Value.Items,Converter={l:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                </DataGrid.Columns>
            </DataGrid>

public class SelectableListArrayToListConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is IEnumerable)
        { 
            List<string> list = new List<string>();
            foreach(var item in value as IEnumerable )
            {
                if (item == null)
                    list.Add("NON");
                else
                    list.Add(item.ToString());

            }
            //Two-way binding requires Path or XPath

            return list;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

公共类SelectableListArrayToListConverter:MarkupExtension,IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(值为IEnumerable)
{ 
列表=新列表();
foreach(值中的变量项为IEnumerable)
{
如果(项==null)
列表。添加(“非”);
其他的
list.Add(item.ToString());
}
//双向绑定需要路径或XPath
退货清单;
}
返回null;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
{
归还这个;
}
}
我认为上面的错误是因为双向绑定不能与List=newlist()一起使用

我相信,当itemssource在设置itemssource之后但在设置DataGridTextColumn绑定之前构建行时,会出现错误

到目前为止,我一直在努力寻找解决这个问题的办法,但运气不佳

如果这篇文章有任何问题,请让我知道,我会纠正它


谢谢。

我认为您的装订不正确。检查绑定的值。项

试试这个

 public Window2()
    {
        InitializeComponent();
        if (Items == null)
            Items = new ObservableCollection<double?>();

        for (int i = 0; i < 50; i++)
        {
            if (i % 5 == 0)
                Items.Add(null);
            else
                Items.Add(i);
        }

        this.DataContext = this;
    }

    public ObservableCollection<double?> Items { get; set; }
公共窗口2()
{
初始化组件();
if(Items==null)
Items=新的ObservableCollection();
对于(int i=0;i<50;i++)
{
如果(i%5==0)
Items.Add(空);
其他的
项目.添加(i);
}
this.DataContext=this;
}
公共ObservableCollection项{get;set;}
XAML:

<DataGrid Name="pointList" ItemsSource="{Binding Path=Items,Converter={local:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                            </DataGrid.Columns>
                        </DataGrid>


我发现下面的链接说我需要为列表中的项目使用包装器。我在对象中创建了第二个属性,该属性将原始列表转换为包装列表并绑定到该列表。我现在要做的就是监视绑定列表中的任何更改,并相应地更新我的原始列表。谢谢您的帮助。

请告诉我们哪行引发此异常。为什么键为空?它没有给我一行,只是说InvalidOperationException未处理{“双向绑定需要路径或XPath”。}我不确定键为什么为空。我提供了一个可观察的集合(它没有钥匙)。ItemsSource必须基于我的列表创建一个键,因为我的列表可以为null,并且有一个null。这就是null必须来自的地方