【发布时间】:2010-06-09 17:10:28
【问题描述】:
我需要根据所选价格和数量计算交易价值。怎么可能
以下是我的 ViewModel:
class ViewModel : ViewModelBase
{
public Trade Trade
{
get { return _trade; }
set { SetField(ref _trade, value, () => Trade); }
} private Trade _trade;
public decimal TradeValue
{
get { return Trade.Amount * Trade.Price; }
}
}
ViewModelBase 继承 INotifyPropertyChanged 并包含 SetField()
以下是 Trade 类:
public class Trade : INotifyPropertyChaged
{
public virtual Decimal Amount
{
get { return _amount; }
set { SetField(ref _amount, value, () => Amount); }
} private Decimal _amount;
public virtual Decimal Price
{
get { return _price; }
set { SetField(ref _price, value, () => Price); }
} private Decimal _price;
......
}
我知道,由于设计原因,我的 TradeValue 只会计算一次(在第一次请求时),并且当金额/价格发生变化时 UI 不会更新。实现这一目标的最佳方法是什么?
非常感谢任何帮助。
更新: INotifyPropertyChanged 实施:
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected virtual void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression)
{
if (selectorExpression == null)
throw new ArgumentNullException("selectorExpression");
var body = selectorExpression.Body as MemberExpression;
if (body == null)
throw new ArgumentException("The body must be a member expression");
OnPropertyChanged(body.Member.Name);
}
protected bool SetField<T>(ref T field, T value, Expression<Func<T>> selectorExpression)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(selectorExpression);
return true;
}
两个答案都有效,现在我不知道选择哪一个作为最佳答案。 Luke 的答案似乎更好,因为代码重复似乎更少,尽管简单地监听 OnPropertyChanged 事件似乎更轻量级。
【问题讨论】:
-
你能把 SetField 的代码贴出来吗?
标签: c# wpf data-binding mvvm