C# 绑定可观察集合<;T>;ItemSource到DataGrid
在我的wpf应用程序中,我使用Prism库将viewmodel自动关联到我的视图中。我对自动绑定视图和模型的简单属性进行了研究。现在,我正在尝试绑定一个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
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
实现了吗?@slagsterIView
仅当我们的ViewModel
被放置在视图
所在的文件夹中时才是必需的。否则,如果我们将其保存在ViewModels
文件夹中,prism
会很小心吗?那么代码中的模型从何而来(是viewmodel)?顺便说一句,你为什么要把你的数据隐藏在代码中?哦,我的糟糕。。我应该把它填在ViewModel
本身,而不是代码隐藏。否则,我需要将模型作为DataContext
分配给视图。我完全被AutoWireViewModel
的东西搞砸了。谢谢你把它指向我们的@adminsoftdk,谢谢你的提示,伙计。我在这方面的知识完全被我在模型中填充数据的方式搞砸了。我应该在ViewModel
而不是backed中完成它。上面的例子给出了一个提示,它现在可以工作了。Bdw,我已将我的ViewModel放在ViewModels
目录中,让prism负责自动布线。。再次非常感谢。