【发布时间】: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<T>用作ItemsSource。它不能添加新项目,它只能枚举现有项目。使用ObservableCollection<T>作为项目源或通过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