实体框架CTP5代码首先,WPF - MVVM建模

Chr*_*eis 5 wpf entity-framework mvvm code-first ef-code-first

我的模型全部为我的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; }
}
Run Code Online (Sandbox Code Playgroud)

建议我的视图模型的推荐方法是什么?我的视图模型将实现INotifyPropertyChanged,我不希望模型类具有任何UI特定代码 - 以便它们可以在其他应用程序中轻松重用.我应该将所有模型属性设置为虚拟,然后在视图模型中覆盖它们吗?(似乎有很多不必要的编码...)EF代码首先使用这种格式很好吗?

编辑 这是一个有点类似的问题在MVVM中,ViewModel或Model应该实现INotifyPropertyChanged吗? 但是,唯一的解决方案似乎是将我认为是UI逻辑添加到模型中.也许我可以在模型中添加某种委托并从viewmodel挂钩,然后将使用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");
                }
            }
        }
...
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 4

我正在做的是将模型类的实例创建为 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
}
Run Code Online (Sandbox Code Playgroud)

然后在 XAML 中我直接绑定到模型属性,例如:

<TextBox Text="{Binding Task.Content}" />
Run Code Online (Sandbox Code Playgroud)

(TaskViewModel 在这里是视图的 DataContext。)

我这样做主要是为了避免你提到的“大量不必要的编码”,而且我找不到缺点。(我也使用 EF Code-First 使我的模型持久化。)

  • @Chris:1)INotifyPropertyChanged 仅包含一个通用的.NET 事件,该事件使得可以从外部观察对象更改。我可以在任何上下文中订阅它,而不仅仅是在 WPF/MVVM 中。该事件也可以在其他项目中使用。如果我不需要它,我就不会订阅。模型属性的变化是模型的一个关注点,所以我不觉得违反关注点分离。2) 当然,ViewModel 不仅仅有一个 Model 实例,例如与 UI 操作相关但实际上不属于 Model 的命令,...(续) (3认同)