在基础对象上实现INotifyPropertyChanged而不是任何属性

时间:2014-02-05 03:46:40

标签: c# wpf inotifypropertychanged

我有一个类,贷款,我在我的ViewModel中有一个实例。

我绑定到贷款中的多个属性,例如

loan.amount;
loan.name;

等。我只在贷款本身提出INotifyPropertyChanged,其余的财产不会提高它。 IE

ViewModel{
loan { get; set { notifypropertychanged("loan")}

我读到的所有内容都说这不起作用,但它确实......实际上,所有贷款属性都正确绑定并更新属性。我一直认为你必须在每个属性上改变notifyproperty,而不能只在主对象上做。我错过了什么吗?

3 个答案:

答案 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