dataContext 有问题,它没有在数据网格中显示

问题描述 投票:0回答:1

看来我

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 中没有任何内容。有什么帮助吗?

wpf mvvm datagrid datacontext
1个回答
0
投票

可能的解决方案之一。

在 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 布局正确性的结论。因此,您必须自己完成这部分。

© www.soinside.com 2019 - 2024. All rights reserved.