Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wpf绑定中的源更新_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# wpf绑定中的源更新

C# wpf绑定中的源更新,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我有一个WPF窗口并给它一个DataContext,当目标更改时,它工作得很好(通过使用UpdateSourceTrigger),但当其中一个DataContext属性(源)更改时,目标不会更新。有没有办法在源更新时强制目标绑定更新?对于一个项目是否有类似于observeablecollection 这是我的班级: public class PaymentDetailInfo : INotifyPropertyChanged { public Payment Payment {

我有一个WPF窗口并给它一个DataContext,当目标更改时,它工作得很好(通过使用
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。我已经更新了答案。如果这回答了你的问题,请告诉我。我非常感谢你的回答,但付款是一个数据库表,我不想这样更改它。