Связывание данных Linq и WPF с базой данных ассоциаций - PullRequest
0 голосов
/ 20 апреля 2010

В моей базе данных 5 таблиц со следующими полями:

  • Заказчик: ID (int), Имя (строка)
  • Проект: ID (int), Имя (строка)
  • Задача: ID (int), Имя (строка)
  • Customer_Project: ID (int), CustomerID (int) ProjectID (int)
  • Project_Task: ID (int), ProjectID (int), TaskID (int)

Последние две таблицы создают ассоциации, поэтому любое количество клиентов может быть связано с любым количеством проектов.То же самое с проектами и задачами.

Я пытаюсь придерживаться хороших стандартов MVVM.В моем элементе управления WPF я уже связал списки в моем представлении с клиентами, задачами и проектами в моей модели представления.У меня есть привязанное свойство TwoWay SelectedCustomer.В моей модели у меня есть объекты для всех этих элементов, и я могу ссылаться на них по идентификатору, имени и т. Д.

Что я хочу сделать, это создать список SelectedProjects и SelectedTasks, где пользователь выбирает только клиентаиз списка, а затем два списка заполняются «связанными» проектами в соответствии с Customer_Project, а также с Projects_Tasks.

Я действительно не хочу взламывать эту функциональность при использовании набора циклов foreach, яЯ полагаю, что должен быть удобный способ с использованием соединений Linq и привязки к динамическим ObservableCollections.

Есть идеи?

1 Ответ

1 голос
/ 21 апреля 2010

Прежде всего, скачайте шаблон MVVM для Visual Studio 2008. Это даст вам класс ViewModelBase, который позволит вашим ViewModels наследовать такие вещи, как уведомление PropertyChange и так далее. Далее сделайте что-то вроде этого:

Вид:

<StackPanel Orientation="Horizontal">
    <ListBox ItemsSource="{Binding Customers}" 
             SelectedItem="{Binding SelectedCustomer}" Width="100"/>
    <ListBox ItemsSource="{Binding Projects}" 
             SelectedItem="{Binding SelectedProject}" Width="100"/>
    <ListBox ItemsSource="{Binding Tasks}" Width="100"/>
</StackPanel>

ViewModel:

/// <summary>
/// MyViewModel class
/// </summary>
public class MyViewModel : ViewModelBase
{
    private DbDataContext _dc;

    /// <summary>
    /// Default constructor
    /// </summary>
    public MyViewModel()
    {
        _dc = new DbDataContext();

        Customers = new ObservableCollection<Customer>(
            (from c in _dc.Customers select c).ToList());
    }

    /// <summary>
    /// Customer List
    /// </summary>
    private ObservableCollection<Customer> _customers;
    public ObservableCollection<Customer> Customers
    {
        get { return _customers; }
        set
        {
            _customers = value;

            // Notify the UI that the collection has changed
            OnPropertyChanged("Customers");
        }
    }

    /// <summary>
    /// When the user selects a customer from the list, 
    /// populate the list of projects for the customer
    /// </summary>
    private Customer _selectedCustomer;
    public Customer SelectedCustomer
    {
        get { return _selectedCustomer; }
        set
        {
            _selectedCustomer = value;
            Projects = new ObservableCollection<Project>(
                (from p in _dc.Projects join c in _dc.Customer_Projects 
                 on p.ID equals c.ProjectID where c.CustomerID == SelectedCustomer.ID 
                 select p).ToList());
        }
    }

    /// <summary>
    /// When the user selects a project from the list, 
    /// populate the list of tasks for the project
    /// </summary>
    private Project _selectedProject;
    public Project SelectedProject
    {
        get {return _selectedProject;}
        set
        {
            _selectedProject = value;
            Tasks = new ObservableCollection<Task>(
                (from t in _dc.Tasks join p in _dc.Project_Tasks 
                 on t.ID equals p.TaskID where p.ProjectID == SelectedProject.ID 
                 select t).ToList());
        }
    }

    /// <summary>
    /// Project List
    /// </summary>
    private ObservableCollection<Project> _projects;
    public ObservableCollection<Project> Projects
    {
        get { return _projects; }
        set
        {
            _projects = value;

            // Notify the UI that the collection has changed
            OnPropertyChanged("Projects");
        }
    }

    /// <summary>
    /// Task List
    /// </summary>
    private ObservableCollection<Task> _tasks;
    public ObservableCollection<Task> Tasks
    {
        get { return _tasks; }
        set
        {
            _tasks = value;

            // Notify the UI that the collection has changed
            OnPropertyChanged("Tasks");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...