INotifyPropertyChanged可以影响派生函数

时间:2017-04-27 06:47:12

标签: c# winforms data-binding inotifypropertychanged

更新:我的问题最初解决了格式问题以及属性"衍生的"来自其他多个房产。我认为这是同样的情况,但正如您从Fabios的回答中看到的那样,事实并非如此。我已经改变了一点问题,明确表示它不是只是格式化。

我使用WinForms进行单向数据绑定,使用INotifyPropertyChanged更新表单。但我无法弄清楚它是如何影响派生函数的。例如,假设我有一个以十进制形式返回价格的函数:

public decimal price 
{
    get { return _price; }
    set 
    { 
        // Set price and notify that it was changed
        _price = value; 
        InvokePropertyChanged(new PropertyChangedEventArgs("price");
    }
}

另一个属性负责货币代码,也可以更改:

public decimal currency
{
    get { return _currency; }
    set
    {
        _currency = value;
       InvokePropertyChanged(new PropertyChangedEventArgs("currency");
    }
}

当价格或货币被更改(设置)时,将调用属性更改函数。但是,在我在GUI中显示之前,我希望将此值格式化并使用货币代码。所以我将数据绑定到派生函数:

public string formattedPrice
{
    get { return string.Format("{0:n0} {1}", price, currency)
}

如何更改pricecurrency会影响formattedPrice?显然我一直在做自己的一些测试,但我似乎无法找到逻辑? InvokepropertyChanged函数的定义如下:

public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(PropertyChangedEventArgs e)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, e);
}

1 个答案:

答案 0 :(得分:1)

您可以在setter中调用PropertyChanged作为格式化值

public decimal price 
{
    get { return _price; }
    set 
    { 
        _price = value; 
        InvokePropertyChanged(new PropertyChangedEventArgs("price");
        InvokePropertyChanged(new PropertyChangedEventArgs("formattedPrice");
    }
}

但是,因为格式化值更多是UI(视图)责任 - 您可以使用Binding.Format事件将其移动到Windows窗体,并保留price属性。

public decimal price 
{
    get { return _price; }
    set 
    { 
        _price = value; 
        InvokePropertyChanged(new PropertyChangedEventArgs("price");
    }
}

// In windows form
var priceBinding = new Binding("Text", sourceObject, "price", true);
priceBinding.Format += (sender, args) => 
{
    var price = (decimal)args.Value;
    args.Value = string.Format("{0:n0} EUR", price);
}

priceTextBox..DataBindings.Add(priceBinding);

有关Binding.Format Event

的更多信息