我有一个类,贷款,我在我的ViewModel中有一个实例。
我绑定到贷款中的多个属性,例如
loan.amount;
loan.name;
等。我只在贷款本身提出INotifyPropertyChanged
,其余的财产不会提高它。 IE
ViewModel{
loan { get; set { notifypropertychanged("loan")}
我读到的所有内容都说这不起作用,但它确实......实际上,所有贷款属性都正确绑定并更新属性。我一直认为你必须在每个属性上改变notifyproperty,而不能只在主对象上做。我错过了什么吗?
答案 0 :(得分:0)
这是应该的方式。当您提出属性更改时,绑定框架将获取属性的更新值。
当您在loan
中提升自定义类型(VM
)的属性上的属性更改时,绑定框架将获得loan
的更新值并且将触及每个属性的getter以及贷款的所有财产绑定在UI上。
答案 1 :(得分:0)
不,这样可以正常工作。您正在指定属性的完整路径,因此沿该路径更改的任何内容都将导致绑定刷新。如果您执行以下操作,它也会起作用:
<StackPanel DataContext="{Binding loan}">
<TextBlock Text="{Binding amount}" />
</StackPanel>
在这种情况下,您没有在TextBlock绑定中指定完整路径,但是它的父级绑定到一个更改通知的属性,并且它会再次通知其子级是否发生了更改。如果您没有获得更改通知,则表明您执行上述操作并保持贷款相同但更改金额。
请记住,应用更改通知的时间有所不同。如果您的UpdateSourceTrigger设置为“PropertyChanged”,并且您希望在值更改时应用更新,则是,您必须将其应用于每个子成员。如果它是LostFocus,那么一旦焦点丢失,它们都将一次性完成,无论它们是否支持更改通知。
答案 2 :(得分:0)
更改通知仅在设置贷款对象时有效,而不在其属性上。
loan.amount = 123;
这使用[loan] Getter 然后[amount] Setter 。
如果您需要侦听父对象,那么您可以将贷款设置为私有变量并从ViewModel公开贷款属性
ViewModel
{
private Loan _loan
public decimal loanAmmont
{
get { return _loan.amount; }
set
{
_loan.amount = value;
notifypropertychanged("loan")
}
}
}
或者将更改通知添加到贷款属性并从父对象注册到他们的更改
ViewModel
{
private Loan _loan;
public Loan loan;
{
get { return _loan; }
set
{
_loan = value;
_loan.PropertyChanged += NotifiyLoanChanged;
}
}
void NotifyLoanChanged(object sender, EventArgs e)
{
// invoke my events to ViewModel listners
notifypropertychanged(e.PropertyName);
}
}
http://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx