WPF MVVM Pattern,ViewModel DataContext问题

时间:2010-05-11 18:26:55

标签: c# ms-access mvvm data-access-layer

我用这边创建我的演示应用程序 http://windowsclient.net/learn/video.aspx?v=314683

该网站在启动时非常有用,在他们的示例中,他们创建了一个名为EmployeeRepository.cs的文件,该文件似乎是数据的来源。在他们的示例中,数据在代码中是硬连线的。所以我正在尝试学习如何从数据源(如数据库)获取数据。在我的具体情况下,我想从Microsoft Access DB获取数据。 (只读,所以我只会使用SELECT命令。)

using System.Collections.Generic;
using Telephone_Directory_2010.Model;

namespace Telephone_Directory_2010.DataAccess
{
    public class EmployeeRepository
    {
        readonly List<Employee> _employees;

        public EmployeeRepository()
        {
            if (_employees == null)
            {
                _employees = new List<Employee>();
            }
            _employees.Add(Employee.CreateEmployee("Student One", "IT201", "Information Technology", "IT4207", "Building1", "Room650"));
            _employees.Add(Employee.CreateEmployee("Student Two", "IT201", "Information Technology", "IT4207", "Building1", "Room650"));
            _employees.Add(Employee.CreateEmployee("Student Three", "IT201", "Information Technology", "IT4207", "Building1", "Room650"));
        }

        public List<Employee> GetEmployees()
        {
            return new List<Employee>(_employees);
        }
    }
}

我找到了另一个使用Access DB但不符合MVVM的示例。所以我试图弄清楚如何将DB文件添加到项目中,如何将其连接起来并将其绑定到列表框(我还没有那么远)。以下是我修改过的文件

using System.Collections.Generic;
using Telephone_Directory_2010.Model;
// integrating new code with working code
using Telephone_Directory_2010.telephone2010DataSetTableAdapters;
using System.Windows.Data;

namespace Telephone_Directory_2010.DataAccess
{
    public class EmployeeRepository
    {
        readonly List<Employee> _employees;

        // start
        // integrating new code with working code
        private telephone2010DataSet.telephone2010DataTable employeeTable;
        private CollectionView dataView;
        internal CollectionView DataView
        {
            get
            {
                if (dataView == null)
                {
                    dataView = (CollectionView) CollectionViewSource.GetDefaultView(this.DataContext);
                }
                return dataView;
            }
        }

        public EmployeeRepository()
        {
            if (_employees == null)
            {
                _employees = new List<Employee>();
            }
            telephone2010TableAdapter employeeTableAdapter = new telephone2010TableAdapter();
            employeeTable = employeeTableAdapter.GetData();
            this.DataContext = employeeTable;
        }

        public List<Employee> GetEmployees()
        {
            return new List<Employee>(_employees);
        }
    }

}

构建

时收到以下错误消息
  

错误1'Teleder_Directory_2010.DataAccess.EmployeeRepository'不包含'DataContext'的定义,也没有找到接受类型为'Telephone_Directory_2010.DataAccess.EmployeeRepository'的第一个参数的扩展方法'DataContext'(你是否错过了使用指令或程序集引用?)C:\ Projects \ VS2010 \ Telephone Directory 2010 \ Telephone Directory 2010 \ DataAccess \ EmployeeRepository.cs 23 90电话簿2010

2 个答案:

答案 0 :(得分:2)

MVVM模式应该建议三层:

Model(= Data-access):从数据库中检索数据,这里应该是你的EmployeeRepository。我建议不要在这里使用任何特定于视图的组件,即没有CollectionView。最好只将员工放在List或ObservableCollection中。

ViewModel:在这里,您可以为视图或实现命令准备数据,视图可以使用这些命令来检索或操作数据等。 在您的示例中,这应该是一些EmployeeViewModel,它从DataAccess-Layer检索所有员工并使其可用作公共属性,以便视图可以绑定到它。不要在此处放置特定于数据库的代码,这些代码应完全包含在数据访问层中。

查看:您的员工 - 包含所有UI内容,按钮和所有内容的视图。当然,您可以在此处放置一些datagrid或ItemsControl,它们绑定到ViewModel并显示其数据。视图的datacontext应该是您的ViewModel,至少这是最常用的方法。

答案 1 :(得分:1)

我认为,为了做你想做的事,你需要研究一些事情。

  1. WPF工具包的DataGridVIew - 使用此数据网格而不是使用列表框来绑定数据,而数据网格与数据集或数据表绑定。 DataGrid

  2. ADO.NET - Access使用OleDB命名空间。您需要创建与数据库的连接,并检索数据。您可以通过它填充绑定到数据网格的数据集。 OleDB

  3. 当你学会了这两个时,你可以坚持使用MVVM,根据我自己的经验,学习这两个是值得的。