Ответ 1
Вы можете использовать собственный конвертер для выполнения простых вычислений непосредственно в XAML.
Посмотрите, например, на эту реализацию:
Простое использование:
<RotateTransform Angle="{Binding Text, ElementName=Seconds,
Converter={ikriv:MathConverter}, ConverterParameter=x*6}" />
Классический подход заключается в создании вычислимого свойства, полученного только для чтения.
Поэтому в этом простом случае вы можете добавить второе свойство HalfWidth
.
public double HalfWidth
{
get
{
return ActualWidth / 2.0;
}
}
Плохая новость заключается в том, что при обновлении ActualWidth
StackPanel
в представлении, привязанным к HalfWidth
, не будет обновляться.
Это связано с тем, что представление не знает, что HalfWidth
изменилось.
Подняв событие измененного свойства на HalfWidth
в настройщике ActualWidth
, представление запросит HalfWidth
и, следовательно, вернет правильное значение.
private double _actualWidth;
public double ActualWidth
{
get
{
return _actualWidth;
}
set
{
if (_actualWidth != value)
{
_actualWidth = value;
OnPropertyChanged("ActualWidth");
OnPropertyChanged("HalfWidth");
}
}
}
Основной аргумент в пользу этого подхода состоит в том, что он скоро станет кошмаром, когда у нас будет множество расчетных свойств без сеттеров.
Вот почему (в шаблоне MVVM) я лично предпочитаю использовать настраиваемый конвертер.