WPF MVVM Pattern, ViewModel DataContext вопрос - PullRequest
1 голос
/ 11 мая 2010

Я использовал эту сторону для создания своего демонстрационного приложения http://windowsclient.net/learn/video.aspx?v=314683

Сайт был очень полезен для начала работы, и в своем примере они создали файл EmployeeRepository.cs, который, по-видимому, является источником данных. В их примере данные были запрограммированы в коде. Поэтому я пытаюсь узнать, как получить данные из источника данных (например, БД). В моем конкретном случае я хочу получить данные из БД Microsoft Access. (ЧИТАЙТЕ ТОЛЬКО, поэтому я буду использовать только команды 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, но она не соответствует MVVM. Поэтому я пытался выяснить, как добавить файл БД в проект, как подключить его и привязать к списку (я не так далеко). Ниже мой модифицированный файл

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: «Telephone_Directory_2010.DataAccess.EmployeeRepository» не содержит определения для «DataContext», и отсутствует метод расширения «DataContext», принимающий первый аргумент типа «Telephone_Directory_2010.DataAccess.EmployeeRepository» (вы пропускаете директива или ссылка на сборку?) C: \ Projects \ VS2010 \ Телефонный справочник 2010 \ Телефонный справочник 2010 \ DataAccess \ EmployeeRepository.cs 23 90 Телефонный справочник 2010

Ответы [ 2 ]

2 голосов
/ 11 мая 2010

MVVM-шаблон должен предлагать три слоя:

Модель (= доступ к данным): получение данных из базы данных, здесь должен быть ваш EmployeeRepository. Я бы порекомендовал не использовать какие-либо специфичные для вида компоненты здесь, т.е. нет CollectionView. Лучше просто поместите своих сотрудников в Список или ObservableCollection.

ViewModel: Здесь вы можете подготовить ваши данные для представления или реализовать команды, которые могут использоваться представлением для извлечения или манипулирования данными и т. Д. В вашем примере это должен быть некий EmployeeViewModel, который извлекает всех сотрудников из уровня DataAccess и делает их доступными как общедоступное свойство, так что представление может привязываться к нему. Не размещайте здесь специфичный для базы данных код, который должен полностью содержаться на уровне доступа к данным.

Просмотр: ваш сотрудник-просмотр, содержащий все элементы пользовательского интерфейса, кнопки и все это. И, конечно, вы можете поместить здесь некоторую сетку данных или ItemsControl, которая привязывается к ViewModel и отображает ее данные. Текст данных вашего представления должен быть вашей ViewModel, по крайней мере, это наиболее распространенный способ сделать это.

1 голос
/ 11 мая 2010

Я думаю, что есть пара вещей, которые нужно исследовать, чтобы сделать то, что вы пытаетесь сделать.

  1. DataGridVIew WPF Toolkit. Вместо использования списка для привязки ваших данных используйте эту сетку данных, которая предназначена для связывания с набором данных или таблицей данных. DataGrid

  2. ADO.NET - Access использует пространство имен OleDB. Вам нужно будет создать соединение с базой данных и получить данные. Вы можете заполнить свой набор данных, который связан с вашей сеткой данных через него. OleDB

Вы можете придерживаться MVVM, когда вы изучили оба из них, и из моего собственного опыта, стоит изучить оба из них.

...