Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 填充要在datagrid控件中显示的可观察集合_C#_Wpf_Mvvm_Entity Framework 6_Entity - Fatal编程技术网

C# 填充要在datagrid控件中显示的可观察集合

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

最近,我启动了一个带有EntityFramework6和WPF应用程序的项目。这两件事我都是新手,但慢慢地我就要做到了

我的数据库正在运行,一个SQL Server数据库。我试图使用绑定项源和绑定列在datagrid上显示一个表。我还确定,考虑到应用程序应该能够做什么,最好的方法是使用可观察的集合

这是我的viewmodel中当前的内容

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));
        }
    }

}