C# 填充要在datagrid控件中显示的可观察集合
最近,我启动了一个带有EntityFramework6和WPF应用程序的项目。这两件事我都是新手,但慢慢地我就要做到了 我的数据库正在运行,一个SQL Server数据库。我试图使用绑定项源和绑定列在datagrid上显示一个表。我还确定,考虑到应用程序应该能够做什么,最好的方法是使用可观察的集合 这是我的viewmodel中当前的内容C# 填充要在datagrid控件中显示的可观察集合,c#,wpf,mvvm,entity-framework-6,entity,C#,Wpf,Mvvm,Entity Framework 6,Entity,最近,我启动了一个带有EntityFramework6和WPF应用程序的项目。这两件事我都是新手,但慢慢地我就要做到了 我的数据库正在运行,一个SQL Server数据库。我试图使用绑定项源和绑定列在datagrid上显示一个表。我还确定,考虑到应用程序应该能够做什么,最好的方法是使用可观察的集合 这是我的viewmodel中当前的内容 private ObservableCollection<Table1> _columnCollection = new ObservableCol
private ObservableCollection<Table1> _columnCollection = new ObservableCollection<Table1>();
public ObservableCollection<Table1> ColumnCollection
{
get
{
return this._columnCollection;
}
set
{
_columnCollection = value;
}
}
然而,数据网格显示为空。
observablecollection是否不会以这种方式拾取SQL表中的所有可用列?
如果没有,我该怎么做?您需要使Table1类继承INotifyPropertyChanged,它应该如下所示:
public class Table1 : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _ID;
public int ID
{
get { return _ID; }
set
{
_ID = value;
RaisePropertyChanged("ID");
}
}
private string _Name;
public string Name
{
get{return _Name;}
set
{
_Name = value;
RaisePropertyChanged("Name");
}
}
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
这会使GridView使用绑定的值进行更新
如果我正确理解了您的问题,这应该会起作用。如果您的视图中有文本,您在哪里设置?你调试过这个来证明你在那个可观察的收集中得到了你的数据吗?顺便说一句,始终在所有视图模型上实现inotifypropertychanged。总是。将实现固定在基类中,并从该基类继承所有vm。不要直接向视图显示ef类。使用automapper(或类似工具)将数据复制到viewmodels并复制回新模型。这样,您就不会用不应该在模型中的东西污染模型,并且您有单独的对象要验证。@Andy datacontext是通过定位器设置的。我已经测试了一些更简单的命令,以确保其设置正确,并且所有这些命令都是成功的。从现在起将使用notifypropertychanged,谢谢。我也会尝试调试,如果你“刚刚开始”,你应该从ef.NETCore/6开始。ef6实际上已经死了。@Andy调试表明它确实携带数据。类中指定的标题会显示,而表中的实际数据会显示not@polygone321SQL中的列是否与模型属性匹配?e、 g.
Id=Id
或者类似于Id=TableOneID——来自数据库
谢谢你的回答:)gridview现在确实显示了来自数据库的列名,是的,但行上仍然显示为空。因此,我猜测集合不会拾取这些(很可能是viewmodel中的错误代码?)知道原因吗?我不确定这一点,但当您绑定ID和名称时,您使用的是“path=”将其绑定到itemsource的该属性。您的itemsSource是ColumnCollection,它本身没有该属性。如果删除“Path=ID”而只写“{Binding ID}”,那么它应该绑定到ColumnCollection的对象。虽然我不是100%确定,但是值得一试。
public class Table1
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Table1 : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _ID;
public int ID
{
get { return _ID; }
set
{
_ID = value;
RaisePropertyChanged("ID");
}
}
private string _Name;
public string Name
{
get{return _Name;}
set
{
_Name = value;
RaisePropertyChanged("Name");
}
}
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}