0

我有一个 WPF 窗口并给它一个 DataContext,当目标更改时它运行良好(通过使用UpdateSourceTrigger),但是当 DataContext 属性(源)之一更改时,目标不会更新。有没有办法在源更新时强制目标绑定更新?一件物品有类似ObservableCollection的东西吗?

这是我的课:

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);
    }

}

我的窗口中的某些元素绑定到PaymentPaymentDetailInfo付款是数据库表),因此作为示例用户可以更改Payment.ConsideredValidNormalOverTime然后PaymentDetailInfo.SumOfValidNormalOverTimePrice将更改然后PaymentDetailInfo.SumOfOverPriceConst将更改。PaymentDetailInfo.SumOfOverPriceConst但是,即使我的表单的数据上下文已更新,绑定到的目标也不会更新。

4

1 回答 1

2

更新 2:*

现在Payment在构造时传递给PaymentDetailInfoPaymentDetailInfo包装了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);
}
}

更新:

由于Payment的更改应该触发更新,我将反转PaymentPaymentDetailInfo之间的关联。然后在payment.DetailInfo上进行绑定。

public class Payment
{
    public PaymentDetailInfo DetailInfo = new PaymentDetailInfo();

    private int _consideredValidNormalOverTime = 0;
    public int ConsideredValidNormalOverTime
    {
        get
        {
            _return _consideredValidNormalOverTime;
        }
        set
        {
            _consideredValidNormalOverTime = value;
            DetailInfo.SumOfValidNormalOverTimePrice = _consideredValidNormalOverTime;
        }
    }
}

public class PaymentDetailInfo : INotifyPropertyChanged
{    
    private int _sumOfValidNormalOverTimePrice = 0;
    public int SumOfValidNormalOverTimePrice
    {
        get
        {
            return __sumOfValidNormalOverTimePrice;            
        }
        set
        {
            __sumOfValidNormalOverTimePrice = 100 * value / 60;
            OnPropertyChanged(new PropertyChangedEventArgs("SumOfValidNormalOverTimePrice"));
        }
    }    

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
}

现在,当ConsideredValidNormalOverTime更新时SumOfValidNormalOverTimePrice也会自动更新源。对所有剩余的属性实施此操作,它应该可以工作。想想在哪里放置SumOfOverPriceConst的逻辑。由于它严重依赖付款,也许你应该把它放在那里。

原来的:

这是实现INotifyPropertyChanged的​​示例。每当名称更改时,目标就会更新。

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
于 2013-08-20T09:21:23.243 回答