Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 绑定可观察集合<;T>;ItemSource到DataGrid_C#_Wpf_Datagrid_Prism - Fatal编程技术网

C# 绑定可观察集合<;T>;ItemSource到DataGrid

C# 绑定可观察集合<;T>;ItemSource到DataGrid,c#,wpf,datagrid,prism,C#,Wpf,Datagrid,Prism,在我的wpf应用程序中,我使用Prism库将viewmodel自动关联到我的视图中。我对自动绑定视图和模型的简单属性进行了研究。现在,我正在尝试绑定一个observateCollection数据,以绑定到DataGrid,但运气不好。下面是我当前场景的结构 ConfigurationDetails.cs public class ConfigurationDetails:BindableBase { private int _id; public int Id { get { r

在我的wpf应用程序中,我使用Prism库将viewmodel自动关联到我的视图中。我对自动绑定视图和模型的简单属性进行了研究。现在,我正在尝试绑定一个
observateCollection
数据,以绑定到
DataGrid
,但运气不好。下面是我当前场景的结构

ConfigurationDetails.cs

public class ConfigurationDetails:BindableBase
{
    private int _id;
    public int Id { get { return _id; } set { SetProperty(ref _id, value); } }

    private string _configFName;
    private string _configSName;
    private string _configUName;

    public string ConfigFName { get { return _configFName; } set { SetProperty(ref _configFName, value); } }
    public string ConfigSName { get { return _configSName; } set { SetProperty(ref _configSName, value); } }
    public string ConfigUName { get { return _configUName; } set { SetProperty(ref _configUName, value); } }
}
public ConfigurationWindow()
{
     InitializeComponent();
     using (_db = new MyEntities())
     {
         var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
         {
              ConfigFName = x.ConfigFName,
              ConfigSName = x.ConfigSName,
              ConfigUName = x.ConfigUName,
              Id = x.ConfigID
         });
         model.ConfigDetails = new ObservableCollection<ConfigurationDetails>(configRecords);
         //model.ConfigDetails will have records assigned to it when debugged
        }
     }
 }
配置WindowViewModel.cs

public class ConfigurationWindowViewModel : BindableBase
{
    public ConfigurationWindowViewModel()
    {
        ConfigDetails = new ObservableCollection<ConfigurationDetails>();
    }
    private ObservableCollection<ConfigurationDetails> _configDetails;
    public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}
公共类配置WindowViewModel:BindableBase
{
公共配置WindowViewModel()
{
ConfigDetails=新的ObservableCollection();
}
私有可观察收集配置详细信息;
公共ObservableCollection ConfigDetails{get{return{u ConfigDetails;}set{SetProperty(ref{u ConfigDetails,value);}
}
ConfigurationWindow.xaml

<UserControl x:Class="MyApp.Views.ConfigurationWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        HorizontalContentAlignment="Center">
    ....
    <DataGrid ItemsSource="{Binding ConfigDetails}" AutoGenerateColumns="False">
         <DataGrid.Columns>
              <DataGridTextColumn Header="F NAME" Width="*" Binding="{Binding Path=ConfigFName}"/>
              <DataGridTextColumn Header="S NAME" Width="*" Binding="{Binding Path=ConfigSName}"/>
              <DataGridTextColumn Header="U NAME" Width="*" Binding="{Binding Path=ConfigUName}"/>
         </DataGrid.Columns>
    </DataGrid>
    ....
</UserControl>

....
....
ConfigurationWindow.xaml.cs

public class ConfigurationDetails:BindableBase
{
    private int _id;
    public int Id { get { return _id; } set { SetProperty(ref _id, value); } }

    private string _configFName;
    private string _configSName;
    private string _configUName;

    public string ConfigFName { get { return _configFName; } set { SetProperty(ref _configFName, value); } }
    public string ConfigSName { get { return _configSName; } set { SetProperty(ref _configSName, value); } }
    public string ConfigUName { get { return _configUName; } set { SetProperty(ref _configUName, value); } }
}
public ConfigurationWindow()
{
     InitializeComponent();
     using (_db = new MyEntities())
     {
         var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
         {
              ConfigFName = x.ConfigFName,
              ConfigSName = x.ConfigSName,
              ConfigUName = x.ConfigUName,
              Id = x.ConfigID
         });
         model.ConfigDetails = new ObservableCollection<ConfigurationDetails>(configRecords);
         //model.ConfigDetails will have records assigned to it when debugged
        }
     }
 }
公共配置窗口()
{
初始化组件();
使用(_db=new MyEntities())
{
var configRecords=\u db.tblConfigs.ToList()。选择(x=>new ConfigurationDetails())
{
ConfigFName=x.ConfigFName,
ConfigSName=x.ConfigSName,
ConfigUName=x.ConfigUName,
Id=x.ConfigID
});
model.ConfigDetails=新的ObservableCollection(configRecords);
//model.ConfigDetails将在调试时为其分配记录
}
}
}
但是,我仍然没有在我的
数据网格中看到任何记录。我在这里遗漏了什么。我还使用了
ViewModelLocator.AutoWireViewModel
,它在其他模型属性上工作得非常完美。希望能在这里得到一些帮助


更新-我的
ConfigurationWindowViewModel.cs
放在
ViewModels
文件夹中。很抱歉没有提到这一点。

您在哪里将ConfigurationDetails对象添加到ConfigDetails集合?尝试在ConfigurationWindowViewModel类的构造函数中添加一些项:

public class ConfigurationWindowViewModel : BindableBase
{
   public ConfigurationWindowViewModel()
   {
    ConfigDetails = new ObservableCollection<ConfigurationDetails>();
    //add some items...:
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
    ConfigDetails.Add(new ConfigurationDetails() { ConfigFName = "F", ConfigSName = "S", ConfigUName = "U" });
   }
   private ObservableCollection<ConfigurationDetails> _configDetails;
   public ObservableCollection<ConfigurationDetails> ConfigDetails { get { return _configDetails; } set { SetProperty(ref _configDetails, value); } }
}

嗯。。。首先,ObservableCollection实现INotifyPropertyChanged,所以您不必这样做

那么这就足够了:

public ObservableCollection<ConfigurationDetails> ConfigDetails { get; set; } 


public ConfigurationWindow()
{
   InitializeComponent();
   using (_db = new MyEntities())
   {
      var configRecords = _db.tblConfigs.ToList().Select(x => new ConfigurationDetails()
     {
          ConfigFName = x.ConfigFName,
          ConfigSName = x.ConfigSName,
          ConfigUName = x.ConfigUName,
          Id = x.ConfigID
     });
     foreach(var config in configRecords)
     { 
        model.ConfigDetails.Add(config);
      }


    }
 }
publicobservableCollection配置详细信息{get;set;}
公共配置窗口()
{
初始化组件();
使用(_db=new MyEntities())
{
var configRecords=\u db.tblConfigs.ToList()。选择(x=>new ConfigurationDetails())
{
ConfigFName=x.ConfigFName,
ConfigSName=x.ConfigSName,
ConfigUName=x.ConfigUName,
Id=x.ConfigID
});
foreach(configRecords中的变量配置)
{ 
model.ConfigDetails.Add(config);
}
}
}

}

您的
ConfigurationWindow
实现了吗?@slagster
IView
仅当我们的
ViewModel
被放置在
视图
所在的文件夹中时才是必需的。否则,如果我们将其保存在
ViewModels
文件夹中,
prism
会很小心吗?那么代码中的模型从何而来(是viewmodel)?顺便说一句,你为什么要把你的数据隐藏在代码中?哦,我的糟糕。。我应该把它填在
ViewModel
本身,而不是代码隐藏。否则,我需要将模型作为
DataContext
分配给视图。我完全被
AutoWireViewModel
的东西搞砸了。谢谢你把它指向我们的@adminsoftdk,谢谢你的提示,伙计。我在这方面的知识完全被我在
模型中填充数据的方式搞砸了。我应该在
ViewModel
而不是backed中完成它。上面的例子给出了一个提示,它现在可以工作了。Bdw,我已将我的ViewModel放在
ViewModels
目录中,让prism负责自动布线。。再次非常感谢。