将可以为null的值集合绑定到DataGrid

时间:2013-06-27 08:48:45

标签: c# wpf data-binding datagrid nullable

我试图将一组可空值(Items=new ObservableCollection<double?>{})绑定到数据网格。下面给出了错误

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

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

当我尝试使用转换器时,我收到以下错误 双向绑定需要Path或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;
    }
}

我认为上述错误是因为twoway绑定不适用于List list = new List();

我相信当itemssource在Itemssource设置之后但在设置DataGridTextColumn Binding之前构建行时,我收到错误。

到目前为止,我已经尝试过广泛地找到这个问题的解决方案而不是运气。

如果此帖有任何问题,请告诉我,我会更正。

感谢。

2 个答案:

答案 0 :(得分:0)

我认为你的绑定不正确。检查 Value.Items 的绑定。

试试这个。

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

XAML:

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

答案 1 :(得分:0)

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