我一直在寻找一个直接的答案,但似乎找不到一个答案。

我试图学习WPF中的MVVM模式,一直想知道我的模型是 Entity Framework 创建的,还是应该创建基本上是 Entity Framework 模型的副本的模型。

例如,我最基本的tblMyEmployees的 Entity Framework 模型如下

    public partial class tblMyEmployee
{
    public int pkEmployee { get; set; }
    public string strFirstName { get; set; }
    public string strLastName { get; set; }
}

因此,我应该创建一个基本上从 Entity Framework 生成的模型中复制并粘贴属性的模型,并使用BaseViewModel以及其他我认为有用的其他属性来实现INotifyPropertyChanged
class EmployeeModel: BaseViewModel
{
    public int pkEmployee { get; set; }
    private string _strFirstName;
    public string strFirstName
    {
        get { return _strFirstName; }
        set
        {
            _strFirstName = value;
            SetProperty(ref _strFirstName, value);
        }
    }
    private string _strLastName;
    public string strLastName
    {
        get { return _strLastName; }
        set
        {
            _strLastName = value;
            SetProperty(ref _strLastName, value);
        }
    }
    private string _strFullName;
    public string strFullName
    {
        get { return strFirstName + " " + strLastName; }
    }
}

还是应该添加我的其他属性,然后将INotifyPropertyChanged实现到生成的模型中?

这似乎是一个非常愚蠢的问题,但是很长一段时间以来,我一直想找到一个明确的答案,但是我一直无法找到答案。

生成的模型顶部的注释使我想知道是否应该基于它创建自己的模型

//此代码是从模板生成的。

//对此文件进行手动更改可能会导致应用程序发生意外行为。

//如果重新生成代码,则对该文件的手动更改将被覆盖。

最佳答案

这是一个无数次被问到的问题,尽管要找到适合您的答案可能很棘手,因为有多种解决方法。选项包括:

  • 为每个模型类创建一个对应的 View 模型。
  • 在编译时使用PropertyChange.Fody为您添加INPC。
  • 使用诸如Castle DynamicProxy之类的东西在运行时注入(inject)INPC(尽管有一些重要的问题要考虑,但是您的ORM需要提供允许您代理它创建的模型对象,尤其是任何集合的功能)。
  • 手动执行INPC。很有可能模型的更改总是来自 View ,在这种情况下,实际上不需要INPC。在这种情况下,唯一需要以其他方式传播的更改是集合的添加和删除,在这种情况下,您将它们保留为常规列表(例如),并在更改列表时手动调用INPC更改事件。 (这是一个难看的解决方案,可能存在性能问题,但这是可能的)。

  • 我使用哪一个取决于项目。我曾经使用#3,但是它与ORM紧密相连,因此不再是我的首选。对于Xamarin工作,我倾向于使用#2,但是对于大多数WPF东西,我倾向于使用 View 模型来管理集合,但是在可能的情况下直接绑定(bind)到模型属性。首先,具有将 View 的多个部分绑定(bind)到同一个 View 模型的功能似乎很吸引人,直到您意识到它创建了一个更困惑的界面并干扰了用户可能期望的任何类型的撤消/取消功能。

    更新:如果确实采用了显式声明所有 View 模型属性的方法,那么您将发现自己反复编写相同的代码。通过将此功能放入代码段中,我节省了大量时间:
    <?xml version="1.0" encoding="utf-8" ?>
    <CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
        <CodeSnippet Format="1.0.0">
            <Header>
                <Title>propc</Title>
                <Shortcut>propc</Shortcut>
                <Description>Code snippet for an automatically implemented change notification property</Description>
                <Author>Mark Feldman</Author>
                <SnippetTypes>
                    <SnippetType>Expansion</SnippetType>
                </SnippetTypes>
            </Header>
            <Snippet>
                <Declarations>
                    <Literal>
                        <ID>type</ID>
                        <ToolTip>Property type</ToolTip>
                        <Default>int</Default>
                    </Literal>
                    <Literal>
                        <ID>property</ID>
                        <ToolTip>Property name</ToolTip>
                        <Default>MyProperty</Default>
                    </Literal>
                </Declarations>
                <Code Language="csharp"><![CDATA[private $type$ _$property$;
        public $type$ $property$
        {
            get { return this._$property$;}
            set
            {
                if (this._$property$ != value)
                {
                    this._$property$ = value;
                    RaisePropertyChanged(() => this.$property$);
                }
            }
        }
        $end$]]>
                </Code>
            </Snippet>
        </CodeSnippet>
    </CodeSnippets>
    

    通过“工具”->“代码片段管理器”导入该代码,然后在类中的任意位置键入“propc”,后跟2个制表符,这将为一个带有后端字段的INPC属性生成大多数样板代码,并让您替换类型和名称:
    private string _MyText;
    public string MyText
    {
        get { return this._MyText; }
        set
        {
            if (this._MyText != value)
            {
                this._MyText = value;
                RaisePropertyChanged(() => this.MyText);
            }
        }
    }
    

    关于wpf - 我是从 Entity Framework 模型创建模型还是编辑 Entity Framework 模型并在MVVM中使用它们?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54856416/

    10-17 01:15