当 DataGrid 绑定到 Double 的列表或可观察集合时,不允许添加行操作

No Add Rows Operation allowed when a DataGrid binds to a list or observable collection of Double

我在我的 ViewModel 中定义了一个 ObservableCollection<double>

ListWidthsFlat=new ObservableCollection<double>();
ListWidthsFlat.Add(120);
ListWidthsFlat.Add(200);

我的XAML代码:

<DataGrid ItemsSource="{Binding Path=ListWidthsFlat}" AutoGenerateColumns="False"
 CanUserAddRows="True" CanUserDeleteRows="True" HorizontalAlignment="Center">
    <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static p:Resources.Width}" Binding="{Binding ., UpdateSourceTrigger=PropertyChanged}" Width="100" />
    </DataGrid.Columns>
</DataGrid>

我想要的是显示 ObservableCollection,然后为我的 ObservableCollection<double>.

中的 add/delete 项提供可能性

当我在 ObservableCollection<T> 上做同样的事情时,一切正常。 但是当绑定到 ObservableCollection<double> 时,参数 CanUserAddRows 似乎不起作用。

编辑 :

经过额外的测试,问题似乎是当我将 DataGrid 绑定到 ObservableCollection<T> 并设置 CanUserAddRow=True 时,会自动创建一个额外的空行(因此我可以编辑它并向 ObservableCollection 添加一个新项目。

当我将 DataGrid 绑定到 ObservableCollection<double> 时,没有创建空行。

这里有一个截图,让它更容易理解:

要正确执行 CanUserAddRows 绑定的对象列表必须实现 IEditableCollectionView Interface,它为绑定的集合提供基本的编辑功能。其中,列表中显示的项目必须具有 public 默认无参数构造函数。

因为值类型 double 没有构造函数,网格检测到它并且不提供添加行;因此,您会单独在 double 上看到失败,但它适用于对象,(class) List<T> 的实例,它具有双重特定属性.


要解决此限制,

  1. 创建一个 class,它有一个 public 无参数构造函数和一个 double 属性。
  2. 然后创建你的 class 列表并绑定到 ObservableCollection (或者 List 实际上也可以工作,如果你不需要 observablecollection 的开销。)你的价值观。
  3. 在 Xaml 中,将数据网格中的列设置为指向双 属性。
  4. 您可能需要编写一个值构造函数,它将接收一个浮点数和 return 一个字符串,并将字符串转换为浮点数。