看来我
dataContext
有问题。假设我有一个由实体框架以数据库优先方法生成的类 tblPerson
。
类似这样的:
public partial class tblPerson
{
public int Id { get; set; }
public string Name { get; set; }
}
我也有这样的
PersonRepository
:
public class PersonRepository
{
private readonly PersonEntities _dbContext;
public PersonRepository(PersonEntities dbContext)
{
_dbContext = dbContext;
}
public IEnumerable<tblPerson> GetAllPeople()
{
return _dbContext.tblPersons.ToList();
}
}
现在这是我的
MainViewModel
:
public class MainViewModel : INotifyPropertyChanged
{
private readonly PersonRepository _personRepository;
private ObservableCollection<tblPerson> _peopleList;
public ObservableCollection<tblPerson> PeopleList
{
get { return _peopleList; }
set
{
_peopleList = value;
OnPropertyChanged(nameof(PeopleList));
}
}
public MainViewModel(PersonRepository personRepository)
{
_personRepository = personRepository;
LoadPeople();
}
private void LoadPeople()
{
var people = _personRepository.GetAllPeople();
PeopleList = new ObservableCollection<tblPerson>(people);
}
}
是不是说我把
app.xaml.cs
改成这样比较好:
public partial class App : Application
{
private IUnityContainer _container;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
_container = new UnityContainer();
_container.RegisterType<Test_EmployeeEntities>();
_container.RegisterType<PersonRepository>();
_container.RegisterType<MainViewModel>();
//var mainWindow = new MainWindow(_container.Resolve<MainViewModel>());
var mainWindow = _container.Resolve<MainWindow>();
}
}
并更改 dataContext 的
MainWindow.xaml.cs
:
public partial class MainWindow : Window
{
// Default constructor (without parameters)
public MainWindow()
{
InitializeComponent();
}
// Constructor expecting MainViewModel
public MainWindow(MainViewModel mainViewModel) : this()
{
DataContext = mainViewModel;
}
}
最后,这是视图中的数据网格:
<DataGrid Grid.Row="1" ItemsSource="{Binding PeopleList}" AutoGenerateColumns="True"/>
问题是当我启动它时,我有
Count=4
代表 PeopleList
以及 DataContext
但 dataGrid 中没有任何内容。有什么帮助吗?
可能的解决方案之一。
在 MainViewModel 中,添加将在 Studio Designer 中使用的默认构造函数,以方便 XAML 开发。
public MainViewModel()
{
// _personRepository = personRepository;
// LoadPeople();
PeopleList = new() {/* Some Items */};
}
将 MainViewModel 实例添加到 App 资源中。
<Application.Resources>
<nms:MainViewModel x:Key="mainVM"/>
启动应用程序时,将此实例替换为适合运行时的实例。
var mainWindow = _container.Resolve<MainWindow>();
Resources["mainVM"] = mainWindow;
将窗口数据上下文绑定到资源中的实例。
<Window ----------------------
----------------------
DataContext="{DynamicResource mainVM}"
从窗口中删除“构造函数期望 MainViewModel”。
结果是 XAML 设计模式和运行时模式的一致视图。您所要做的就是检查窗口数据上下文是否已传输到 DataGrid 的数据上下文。不幸的是,您提供的代码片段不足以让我们得出有关 XAML 布局正确性的结论。因此,您必须自己完成这部分。