I used this side to create my demo application
http://windowsclient.net/learn/video.aspx?v=314683
The site was very useful in getting my started and in their example, they created a file called EmployeeRepository.cs which appears to be the source for the data. In their example, the data was hard-wired in code. So I’m trying to learn how to get the data from a data source (like a DB). In my specific case, I want to get the data from a Microsoft Access DB. (READ ONLY, So I’ll only use SELECT commands).
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);
}
}
}
I found another example where an Access DB is used but it doesn’t comply with MVVM. So I was trying to figure out how to add the DB file to the project, how to wire it up and bind it to a listbox (i’m not that far yet). Below is my modified file
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);
}
}
}
I get the following error messages when building
Error 1 ‘Telephone_Directory_2010.DataAccess.EmployeeRepository’ does not contain a definition for ‘DataContext’ and no extension method ‘DataContext’ accepting a first argument of type ‘Telephone_Directory_2010.DataAccess.EmployeeRepository’ could be found (are you missing a using directive or an assembly reference?) C:\Projects\VS2010\Telephone Directory 2010\Telephone Directory 2010\DataAccess\EmployeeRepository.cs 23 90 Telephone Directory 2010
The MVVM-pattern should suggest three layers:
Model (=Data-access): Retrieve data from database, here should be your EmployeeRepository. I would recommend not to use any view-specific components here, i.e. no CollectionView. Better just put your employees in a List or ObservableCollection.
ViewModel: Here you can prepare your data for the view or implement commands, which can be used by the view to retrieve or manipulate data etc.
In your example this should be some EmployeeViewModel, that retrieves all the employees from the DataAccess-Layer and makes them available as public property, such that the view can bind to it. Do not put database-specific code here, that should completely be contained in the data-access-layer.
View: Your employee-View containing all the UI-stuff, buttons and all this. And of course you can put some datagrid or ItemsControl here, which binds to the ViewModel and displays its data. The datacontext of your view should be your ViewModel, at least that’s the most common way how to do it.