关于c#:将数据传递给模型而不触发PropertyChanged-Event

Pass Data to Model without triggering PropertyChanged-Event

我是MVVM的新手,正在使用它编写一个小的测试应用程序。我有一个模型,它代表数据结构-一个视图模型和一个视图(父类也是page)。

现在我想把一些初始数据传递给模型,所以窗户可以给我看这些。

在David Anderson的示例应用程序中,他传递数据作为方法参数,这实际上是正确的方法和原因不是PropertyChanged事件的触发器,而是我的模型类相当"胖"——它有很多特性(>30)。那么,在这种情况下,我该如何认识到呢?我不认为有超过30个参数的方法是正确的处理这个问题的方法。还是我错了?

有人知道吗,专业人士是如何认识到这一点的?

这是我用过的代码:

视图(PersonPropertiesView是页面类的子类)

XAML

1
<TextBlock Text="{Binding Person.ID, UpdateSourceTrigger=PropertyChanged}" />

代码隐藏

1
2
3
4
5
public PersonPropertiesView()
{
    InitializeComponent();
    this.DataContext = new PersonPropertiesViewModel();
}

视图模型(个人属性视图模型)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private Person _Person;

public Person Person
{
    get
    {
        return this._Person;
    }
}

public Person()
{
    this._Person = new Individual();
    this._Person.ID = 12;
}

模型(Person,继承InotifyPropertiesChanged)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private long _ID;

public long ID
{
    get
    {
        return this._ID;
    }
    set
    {
       if (this._ID != value)
       {
           this._ID = value;
           OnPropertyChanged("ID");
       }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)
{
    if (propertyName != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

如果我尝试编译此代码,我会得到System.Reflection.TargetInvocationException异常。有人知道为什么吗?


我的第一反应是:为什么?我不确定这是否太重要-在构造后立即设置这些属性时,我可以想象,在将ViewModel绑定到任何视图之前,这个occurs很可能会被绑定到任何视图(尽管没有上下文,我不能确定)。

试图在没有观察员的情况下发射PropertyChanged事件的代价可能太小,无法衡量。

在您发布的代码中,当没有侦听器时,此代码将引发异常:

1
2
3
4
5
protected void OnPropertyChanged(string propertyName)
{
    if (propertyName != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

您需要检查事件是否为空,而不是属性名:

1
2
3
4
5
6
7
8
protected void OnPropertyChanged(string propertyName)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}