Модель MVVM - связь между моделями - PullRequest
1 голос
/ 18 июля 2011

Допустим, у меня есть следующие модели:

class Worker
{
    int Id;
    string firstname;
    string lastname;    
}

class Department
{
    string title;
    string description; 
    List<Worker> workers;
}

Я хочу отобразить в пользовательском интерфейсе название отдела, описание и список работников внутри списка (в списке я хочу отображать только имя и фамилию).
Нужно ли создавать ОДНУ модель представления, которая обернет это отношение, или я должен создать модель представления для каждой имеющейся у меня модели?

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

Вы можете создать в ViewModel, которая обернет их обоих как:

namespace XXXX.ViewModel
{
public class MainViewModel : ViewModelBase
{
    private int _id;
    private string _total;
    private string _description;

    private ObservableCollection<Worker> _workers;

    public int Id
    {
        get { return _id; }
        set
        {
            if (value == _id) return;
            _id = value;
            RaisePropertyChanged("Id");
        }
    }
    public string Total
    {
        get { return _total; }
        set
        {
            if (value == _total) return;
            _total = value;
            RaisePropertyChanged("Total");
        }
    }
    public string Description
    {
        get { return _description; }
        set
        {
            if (value == _description) return;
            _description = value;
            RaisePropertyChanged("Description");
        }
    }
    public ObservableCollection<Worker> Workers
    {
        get { return _workers; }
        set
        {
            if (value == _workers) return;
            _workers = value;
            RaisePropertyChanged("Workers");
        }
    }

    //****************** You Logic *************************
    public MainViewModel()
    {
        Department department = new Department();
    }
    //****************** You Logic *************************
}
}
2 голосов
/ 18 июля 2011

У вас не будет ViewModel для каждой модели, в MVVM у вас должен быть уникальный ViewModel почти для каждого вида.Затем вы должны сопоставить модель с моделью представления.

Например:

 public class DepartmentViewModel
        {
            public string title { get; set; }

            public string description { get; set; }

            public IEnumerable<Worker> workers { get; set; }

            //Additional ViewModel properties here
            //These may or may not be items that exist in your Model

            /// <summary>
            /// Mapped to the description but truncated to 10 characters and followed by an elispe (...)
            /// </summary>
            public string ShortDescription
            {
                get
                {
                    return description.Substring(0,10) + "...";
                }
            }
    }

Сначала я понимаю, что это выглядит несколько излишним.Тем не менее, могут быть и другие типы представлений, отличные от 1: 1, которые вы можете создать из модели.

Также обратите внимание на automapper.org, это отличный инструмент для отображения объекта на объект.

0 голосов
/ 18 июля 2011

У вас есть 1 модель представления, которая содержит как работников, так и отдел.

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

<ListBox x:Name="_workers" ItemsSource="{Binding Workers}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding firstname}" />
            <TextBlock Text=" " />
            <TextBlock Text="{Binding lastname}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Модель представления должна содержать:

private string _title;
public string Title {
    get {return _title;}
    set {_title = value; RaisePropertyChanged("Title");}
}
private string _description;
public string Description {
    get {return _description;}
    set {_description= value; RaisePropertyChanged("Description");}
}
public ObservableCollection Workers {get; private set;}

public Constructor()
{
    Workers = new ObservableCollection();
}

//This method is called by the model once it has fetched data.
//This can be done as a callback or in an event handler
public CalledByTheModelAfterLoadingData(Department department)
{
    Title = department.Title;
    Description = department.Description;
    foreach (var worker in department.Workers)
    {
        Workers.Add(worker);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...