更新:我的问题最初解决了格式问题以及属性"衍生的"来自其他多个房产。我认为这是同样的情况,但正如您从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)
}
如何更改price
或currency
会影响formattedPrice
?显然我一直在做自己的一些测试,但我似乎无法找到逻辑? InvokepropertyChanged
函数的定义如下:
public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, e);
}
答案 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);
的更多信息