Мне нужно рассчитать стоимость сделки на основе выбранной цены и количества.Как можно
Следующее - моя 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 рассчитывается только один раз (при первом запросе), а пользовательский интерфейс не обновляется при изменении суммы / цены.Каков наилучший способ достижения этого?
Любая помощь с благодарностью.
Обновление: Реализация 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;
}
Оба ответа работают,теперь я не знаю, какой из них выбрать лучший ответ.Ответ Люка кажется лучше, так как, кажется, меньше повторений кода, хотя простое прослушивание события OnPropertyChanged кажется более легким.