Подтвердить что ты не робот

Можно ли применить математический оператор к пути привязки?

Могу ли я иметь следующее (ActualWidth, деленное на 2)?

<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}">

Кажется, я не работаю для меня.

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать собственный конвертер для выполнения простых вычислений непосредственно в XAML.

Посмотрите, например, на эту реализацию:

MathConverter

Простое использование:

<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) я лично предпочитаю использовать настраиваемый конвертер.

Ответ 2

Нет, вы можете использовать свойства (и индексы в массивы/коллекции в некоторых случаях) в привязках.

Вместо этого вам нужно либо привязать свойство notify, которое возвращает заданное значение (например, ActualWidth/2), либо использовать конвертер, который возвращает значение с использованием вашего расчета.