将可为null的值的集合绑定到DataGrid
本文关键字:绑定 DataGrid 集合 null | 更新日期: 2023-09-27 18:20:02
我正试图将一组可为null的值(Items=new ObservableCollection<double?>{}
)绑定到数据网格。下面给了我错误
值不能为null。参数名称:密钥
<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;
}
}
我认为上面的错误是因为双向绑定不适用于List-List=new List();
我相信当itemssource在设置itemssource之后但在设置DataGridTextColumn Binding之前构建行时,我会遇到错误。
到目前为止,我已经广泛地尝试找到解决这个问题的方法,但没有成功。
如果这篇文章有任何问题,请让我知道,我会纠正的。
谢谢。
我找到了下面的链接,它说我需要为列表中的项目使用包装器。我在对象中创建了第二个属性,将原始列表转换为换行列表并绑定到该列表。我现在所要做的就是监视绑定列表中的任何更改,并相应地更新我的原始列表。谢谢你的帮助。
我认为您的绑定不正确。检查值的绑定。项目.
试试这个。
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>