Entity Framework CTP5 Code First, WPF - MVVM моделирование - PullRequest
5 голосов
/ 21 февраля 2011

Моя модель полностью настроена для моего приложения WPF и вначале работает с кодом ctp5 каркаса сущностей, вот пример класса модели:

public class Task
{
    public int ID { get; set; }
    public int Index { get; set; }
    public string Content { get; set; }
    public int Indentation { get; set; }
    public DateTime Start { get; set; }
    public decimal Effort { get; set; }
    public decimal CompletedEffort { get; set; }
    public decimal Cost { get; set; }
}

Каков рекомендуемый способ построения модели представления?Мои модели представлений будут реализовывать INotifyPropertyChanged, я не хочу, чтобы классы моделей имели какой-либо специфический для пользовательского интерфейса код, чтобы их можно было легко использовать в других приложениях.Должен ли я сделать все свойства модели виртуальными, а затем переопределить их в модели представления?(кажется, много ненужного кодирования ...) Будет ли код EF сначала хорошо играть с этим типом формата?

Редактировать Это несколько схожий вопрос В MVVM следуетViewModel или Model реализуют INotifyPropertyChanged? однако единственные решения, по-видимому, заключаются в добавлении в модель того, что я считаю логикой пользовательского интерфейса.Возможно, я могу добавить своего рода делегата в модель и подключить его к модели представления, которая, в свою очередь, будет использовать INotifyPropertyChanged ... что-то вроде этого?

    public class Task
    {
        public delegate void HandleChange(string propertyName);
        public HandleChange ChangeHandler;

        public int ID 
        { 
            get
            {
                return ID;
            } 
            set
            {
                if(ID != value)
                {
                    ID = value;
                    ChangeHandler("ID");
                }
            }
        }
...

Ответы [ 2 ]

4 голосов
/ 21 февраля 2011

Я делаю экземпляр класса моей модели для свойства в ViewModel, а затем реализую INotifyPropertyChanged непосредственно в Model для свойств Model и в ViewModel только для экземпляра Model, например так:

public class Task : INotifyPropertyChanged
{
    // Implementation of INotifyPropertyChanged
    // Raising the PropertyChanged event in the Setters of all properties
}

public class TaskViewModel : INotifyPropertyChanged
{
    private Task _task;
    public Task Task
    {
        get
        {
            return _task;
        }
        set
        {
            if (_task != value)
            {
                _task = value;
                RaisePropertyChanged("Task");
            }
        }
    }

    // INotifyPropertyChanged implementation
}

Затем в XAML я связываюсь напрямую со свойствами модели, например:

<TextBox Text="{Binding Task.Content}" />

(здесь TaskViewModel будет DataContext для представления.)

Я делаю это, главным образом, чтобы избежать этой «ненужной кодировки», о которой вы упомянули, и я не смог найти недостаток. (Я также делаю свою модель постоянной с EF Code-First.)

3 голосов
/ 25 мая 2011

Я знаю, что это старая ветка, но я гуглял по этой теме и наткнулся на эту статью blogs.msdn.com: http://bit.ly/iE3KHI

Короче говоря, начиная с CTP 4 EF CodeFirst тамявляется новым свойством объекта CodeFirst dbSet .Local..Local - это ObservableCollection, которая реализует INotifyPropertyChanged.Поэтому, если у вас есть код dbcontext, который представляет DbSet (Of Task), называемый Tasks, вы можете установить для контекста данных формы значение Tasks.Local.

...