C# wpf绑定中的源更新
我有一个WPF窗口并给它一个DataContext,当目标更改时,它工作得很好(通过使用C# wpf绑定中的源更新,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个WPF窗口并给它一个DataContext,当目标更改时,它工作得很好(通过使用UpdateSourceTrigger),但当其中一个DataContext属性(源)更改时,目标不会更新。有没有办法在源更新时强制目标绑定更新?对于一个项目是否有类似于observeablecollection 这是我的班级: public class PaymentDetailInfo : INotifyPropertyChanged { public Payment Payment {
UpdateSourceTrigger
),但当其中一个DataContext属性(源)更改时,目标不会更新。有没有办法在源更新时强制目标绑定更新?对于一个项目是否有类似于observeablecollection
这是我的班级:
public class PaymentDetailInfo : INotifyPropertyChanged
{
public Payment Payment
{
get;
set;
}
public int SumOfValidNormalOverTimePrice
{
get
{
return 100 * Payment.ConsideredValidNormalOverTime / 60;
}
}
public int SumOfInvalidNormalOverTimePrice
{
get
{
return 100 * Payment.ConsideredInvalidNormalOverTime / 60;
}
}
public int SumOfOverPriceConst
{
get
{
int _sumOfOverPriceConst = 0;
if (!Payment.ValidNormalOverTimePriceIsPercent)
_sumOfOverPriceConst += SumOfValidNormalOverTimePrice;
if (!Payment.InvalidNormalOverTimePriceIsPercent)
_sumOfOverPriceConst += SumOfInvalidNormalOverTimePrice;
_sumOfOverPriceConst += Payment.RewardPrice;
return _sumOfOverPriceConst;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
}
我的窗口中的某些元素绑定到
PaymentDetailInfo
的Payment
(Payment是一个数据库表),因此,作为一个示例,用户可以更改Payment.consideredvalidnormalevertime
然后PaymentDetailInfo.sumofvalidnormalevertimeprice
将更改,然后PaymentDetailInfo.SumOfOverPriceConst
将更改。但是绑定到PaymentDetailInfo.sumoforpriceconst的目标不会更新,即使我表单的数据上下文已更新。更新2:
public class Foo: INotifyPropertyChanged
{
#region field and properties
private string _name = String.Empty;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
#endregion
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
#endregion
现在,付款在施工时传递给付款详细信息PaymentDetailInfo包装了Payment的属性,因此您可以单独在PaymentDetailInfo上创建绑定
我已经把SumOfValidNormalOverTimePrice的设定者定为私人。我想这应该行得通,但我还没有测试过
public class PaymentDetailInfo : INotifyPropertyChanged
{
/// <summary> The payment model.
/// </summary>
private Payment _model = null;
/// <summary> Constructor.
/// </summary>
public PaymentDetailInfo(Payment payment)
{
_model = payment;
}
/// <summary> Wrapper around Payment.ConsideredValidNormalOverTime.
/// </summary>
public int ConsideredValidNormalOverTime
{
get { return _model.ConsideredValidNormalOverTime; }
set
{
_model.ConsideredValidNormalOverTime = value;
// make sure to set the property and not the backing field, otherwise OnPropertyChanged won't be
// called and the value of _sumOfValidNormalOverTimePrice will be incorrect
SumOfValidNormalOverTimePrice = value;
OnPropertyChanged(new PropertyChangedEventArgs("ConsideredValidNormalOverTime"));
}
}
private int _sumOfValidNormalOverTimePrice = 0;
public int SumOfValidNormalOverTimePrice
{
get { return _sumOfValidNormalOverTimePrice; }
private set
{
_sumOfValidNormalOverTimePrice = 100 * value / 60;
OnPropertyChanged(new PropertyChangedEventArgs("SumOfValidNormalOverTimePrice"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
}
现在,当更新ConsidedValidnormalevertime时,也会自动更新源。对所有剩余属性执行此操作,它应该可以工作。只需考虑将SumoForPriceConst的逻辑放在哪里即可。由于它严重依赖于付款,也许你应该把它放在那里
原件:
下面是实现INotifyPropertyChanged的示例。每当Name更改时,目标就会更新
public class Foo: INotifyPropertyChanged
{
#region field and properties
private string _name = String.Empty;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
#endregion
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
#endregion
在数据类上实现INotifyPropertyChanged接口以更新目标绑定。这是使用MVVM更新目标的标准方法。你能发布你的代码吗?我更新了我的问题,我不知道在哪里我必须调用PropertyChanged(new PropertyChangedEventArgs(“Name”);类Foo仅在名称实际更改时调用PropertyChanged。你的类只包含getter,除了Payment之外没有setter。您想在付款更改时更新所有属性吗?我想在付款的每个属性更新时更新PaymentDetailInfo.SumOfOverPriceConst。我已经更新了答案。如果这回答了你的问题,请告诉我。我非常感谢你的回答,但付款是一个数据库表,我不想这样更改它。