Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Prism、MVVM中分离业务模型和视图模型_C#_Wpf_Prism - Fatal编程技术网

C# 在Prism、MVVM中分离业务模型和视图模型

C# 在Prism、MVVM中分离业务模型和视图模型,c#,wpf,prism,C#,Wpf,Prism,我正在看WPF棱镜的例子。在Brian repo中,他在简单的MVVM WPF应用程序上找到了这个简单的示例: 现在我想把firstName、lastName和lastUpdated属性放在单独的类中,它的“业务模型”称为Person。我写了这样的东西,我想知道它是否正确 在ViewAViewModel中,我使用prism代码段设置了property person: private Person person; public Person Person { get { return p

我正在看WPF棱镜的例子。在Brian repo中,他在简单的MVVM WPF应用程序上找到了这个简单的示例:

现在我想把firstName、lastName和lastUpdated属性放在单独的类中,它的“业务模型”称为Person。我写了这样的东西,我想知道它是否正确

在ViewAViewModel中,我使用prism代码段设置了property person:

private Person person;
public Person Person
{
    get { return person; }
    set { SetProperty(ref person, value); }
}
我的Person类如下所示:

public class Person:BindableBase
    {

        private string firstName = "Karol";
        public string FirstName 
        {
            get { return firstName; }
            set
            {
                SetProperty(ref firstName, value);
            }
        }
}
private Person _person;
public Person Person
{
    get { return _person; }
    set
    {
        if (_person != null)
            _person.PropertyChanged -= Person.PropetryChanged;
        SetProperty(ref _person, value);
        if (_person != null) 
            _person.PropertyChanged -= Person.PropetryChanged;
    }
}
现在,这是一种正确的方法吗。我在某个地方读到,在person类中,我更应该使用标准的OnPropertyChanged()方法。你觉得怎么样

编辑:

我记得我在想什么。我看过Brian Langunas关于Prism的网络研讨会,他说ViewModel中的人物道具应该这样做:

public class Person:BindableBase
    {

        private string firstName = "Karol";
        public string FirstName 
        {
            get { return firstName; }
            set
            {
                SetProperty(ref firstName, value);
            }
        }
}
private Person _person;
public Person Person
{
    get { return _person; }
    set
    {
        if (_person != null)
            _person.PropertyChanged -= Person.PropetryChanged;
        SetProperty(ref _person, value);
        if (_person != null) 
            _person.PropertyChanged -= Person.PropetryChanged;
    }
}

他说,这与内存管理有关。可以在ViewMode llifetime中多次设置property Person,您必须首先检查是否有以前的实例并取消订阅。如果不这样做,则可能会出现内存泄漏。但这是很久以前的事了(2015年),也许它是固定的。这是链接(1:04:20):你能指一下吗?问候

除了依赖于
Prism
BindableBase
类之外,您的方法没有任何错误

如果
Person
是“更大”域的一部分,也可能用于您的服务和/或业务层,您可能不希望这样做

然后,您最好使它成为一个普通的旧CLR(POCO)对象,它不依赖于任何第三方UI框架。当然,它仍然可以实现内置的
INotifyPropertyChanged
接口