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

WPF DataBinding с простой арифметической операцией?

Я хочу добавить постоянное значение на входящее целое число. На самом деле у меня есть несколько мест, где я хочу привязываться к одному и тому же исходному значению, но добавляю разные константы. Поэтому идеальным решением было бы что-то вроде этого...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/>

(ПРИМЕЧАНИЕ. Это пример, чтобы показать идею, мой фактический сценарий привязки - это не свойство canvas TextBox, но это ясно показывает идею)

В настоящее время единственным решением, которое я могу представить, является раскрытие множества различных исходных свойств, каждый из которых добавляет другую константу к одному и тому же внутреннему значению. Поэтому я мог бы сделать что-то вроде этого...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/>

Но это довольно мрачно, потому что в будущем мне может понадобиться добавлять новые свойства для новых констант. Также, если мне нужно изменить добавленную стоимость, мне нужно перейти к исходному объекту, который довольно невнимателен.

Должен быть более общий путь, чем этот? Любые эксперты WPF получили какие-либо идеи?

4b9b3361

Ответ 2

Я использую MathConverter, который я создал для выполнения всех простых арифметических операций. Код для конвертера здесь, и его можно использовать следующим образом:

<TextBox Canvas.Top="{Binding SomeValue, 
             Converter={StaticResource MathConverter},
             [email protected]+5}" />

Вы даже можете использовать его с более продвинутыми арифметическими операциями, такими как

Width="{Binding ElementName=RootWindow, Path=ActualWidth,
                Converter={StaticResource MathConverter},
                ConverterParameter=((@VALUE-200)*.3)}"

Ответ 3

Использование конвертера значений является хорошим решением проблемы, так как позволяет изменять исходное значение, поскольку оно связано с пользовательским интерфейсом.

Я использовал следующее в нескольких местах.

public class AddValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = value;
        int parameterValue;

        if (value != null && targetType == typeof(Int32) && 
            int.TryParse((string)parameter, 
            NumberStyles.Integer, culture, out parameterValue))
        {
            result = (int)value + (int)parameterValue;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Пример   

 <Setter Property="Grid.ColumnSpan"
         Value="{Binding 
                   Path=ColumnDefinitions.Count,
                   RelativeSource={RelativeSource AncestorType=Grid},
                   Converter={StaticResource addValueConverter},
                   ConverterParameter=1}"
  />

Ответ 4

Я никогда не использовал WPF, но у меня есть возможное решение.

Можно ли привязать путь к карте? Если это так, он должен иметь возможность принять аргумент (ключ). Вам нужно создать класс, который реализует интерфейс Map, но на самом деле просто возвращает базовое значение, которое вы инициализировали "Карта" с добавлением к ключу.

public Integer get( Integer key ) { return baseInt + key; }  // or some such

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