将数据传递给模型而不触发PropertyChanged-Event

时间:2014-01-11 15:23:07

标签: c# wpf mvvm

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

现在我想将一些初始数据传递给模型, 所以窗口可以告诉我这些。

sample application of David Anderson中,他传递数据 作为方法参数,这实际上是正确的方式和原因 不是PropertyChanged-Event的触发器,而是我的Model-class 非常“胖” - 它有很多属性(> 30)。 那么,在这种情况下我该如何实现呢? 我不认为具有超过30个参数的方法是正确的 处理这个问题的方法。或者我错了吗?

有人有想法,专业人士如何实现这一点?

这是我用过的代码:

查看(PersonPropertiesView是Page-class的子类)

XAML

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

代码隐藏

public PersonPropertiesView()
{
    InitializeComponent();
    this.DataContext = new PersonPropertiesViewModel();
}

ViewModel (PersonPropertiesViewModel)

代码

private Person _Person;

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

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

模型(Person,继承INotifyPropertyChanged)

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异常。有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

我的第一反应是:为什么?我不确定这是否太重要 - 在构造之后立即设置这些属性时,我会想象在ViewModel绑定到任何View之前发生这种情况很可能(尽管没有上下文,我无法确定)。 / p>

尝试在没有观察员的情况下发起PropertyChanged事件的成本可能太小而无法衡量。

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

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

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

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