gpt4 book ai didi

wpf - Entity Framework CTP5 代码优先,WPF - MVVM 建模

转载 作者:行者123 更新时间:2023-12-04 18:15:04 25 4
gpt4 key购买 nike

我为我的 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; }
}

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

编辑
这是一个有点相似的问题 In MVVM should the ViewModel or Model implement INotifyPropertyChanged?但是,唯一的解决方案似乎是将我认为是 UI 逻辑的内容添加到模型中。也许我可以向模型添加某种委托(delegate)并从 View 模型中 Hook ,这将反过来使用 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");
}
}
}
...

最佳答案

我正在做的是将我的模型类的实例创建为 ViewModel 中的一个属性,然后实现 INotifyPropertyChanged直接在模型上用于模型属性,在 View 模型上仅用于模型实例,如下所示:

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 中我直接绑定(bind)到模型属性,例如:
<TextBox Text="{Binding Task.Content}" />

(TaskViewModel 将是 View 的 DataContext。)

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

关于wpf - Entity Framework CTP5 代码优先,WPF - MVVM 建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com