【问题标题】:How to use WPF-DataGrid to add new rows to Fluent-nHibernate-Data?如何使用 WPF-DataGrid 向 Fluent-nHibernate-Data 添加新行?
【发布时间】:2019-08-07 05:24:55
【问题描述】:

我有一个 WPF-DataGrid 来显示 nHibernate 数据。 xaml 看起来像这样:

<DataGrid x:Name="myDataGrid" AddingNewItem="myDataGrid_AddingNewItem" CanUserAddRows="true"/>

要在 dataGrid 中显示数据,我使用此代码

    public MainWindow()
    {
        InitializeComponent();
        var erg = from p in m_Dbsession.Query<LovTestData>()
        select new LovTestDataDatasource
        {
            SomeString = p.SomeString,
            SomeOtherString = p.SomeOtherString
        };

        myDataGrid.ItemsSource = erg.ToList();
    }

我的 DatasourceClass 如下所示:

class LovTestDataDatasource : IEditableObject
{ 
    public LovTestDataDatasource()
    { }

    public string SomeOtherString { get; internal set; }
    public string SomeString { get; internal set; }

    public void BeginEdit()
    {

    }

    public void CancelEdit()
    {

    }

    public void EndEdit()
    {

    }
}

问题是,我看不到添加新行的可能性。底部有一个空行,但不可编辑。插入键也不起作用,并且永远不会调用 myDataGrid_AddingNewItem。

我做错了什么?

编辑:

这似乎与我的数据源类有关,因为当我将 ItemsSoure 设置更改为:

        var erg = from p in m_Dbsession.Query<LovTestData>()
                  select p;

        myDataGrid.ItemsSource = erg.ToList();

我可以编辑行并调用 myDataGrid_AddingNewItem。

另一个编辑:

我试过了:

        var erg = from p in m_Dbsession.Query<LovTestData>()
                  select new LovTestDataDatasource
                  {
                      SomeString = p.SomeString,
                      SomeOtherString = p.SomeOtherString
                  };
        myDataGrid.ItemsSource = new ObservableCollection<LovTestDataDatasource>(erg.ToList());

但这没有用。

【问题讨论】:

  • 由于您使用的是 WPF,我建议您使用 MVVM 概念。因此,不要在代码中分配 ItemsSource 属性,而是在 XAML 中为该属性创建绑定并在视图模型中提供值。不过,这对于您的问题来说有点离题。在您的代码中,您将IEnumerable&lt;T&gt; 用作ItemsSource。它不能添加新项目,它只能枚举现有项目。使用ObservableCollection&lt;T&gt; 作为项目源或通过CollectionViewSource 使用CollectionView。 SO上有很多关于它的问题和答案。
  • @dymanoid:但是为什么“from p in m_Dbsession.Query() select p;”之间有区别和“从 p in m_Dbsession.Query() 中选择新的 LovTestDataDatasource { someString = p.SomeString, SomeOtherString = p.SomeOtherString };”
  • @dymanoid:我尝试了 ObservableCollection,但它不起作用(请参阅问题中的“另一个编辑”。

标签: c# wpf datagrid fluent-nhibernate


【解决方案1】:

将 Datasource 类中的内部设置器更改为 public。

public string SomeOtherString { get; set; }
public string SomeString { get; set; }

如果您将它们保留为内部,则 PresentationFramework 没有这些属性的可访问设置器(因为它们来自不同的程序集)。它们被认为是只读的,因此无法从 DataGrid 中进行编辑。

【讨论】:

  • 工作正常!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-12-14
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多