我是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异常。有人知道为什么吗?
答案 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));
}
}