WPF DataBinding с простой арифметической операцией? - PullRequest
15 голосов
/ 24 сентября 2008

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

<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 есть идеи?

Ответы [ 4 ]

19 голосов
/ 20 августа 2011

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

<TextBox Canvas.Top="{Binding SomeValue, 
             Converter={StaticResource MathConverter},
             ConverterParameter=@VALUE+5}" />

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

Width="{Binding ElementName=RootWindow, Path=ActualWidth,
                Converter={StaticResource MathConverter},
                ConverterParameter=((@VALUE-200)*.3)}"
7 голосов
/ 24 сентября 2008

Я полагаю, что вы можете сделать это с помощью преобразователя значений. Вот запись в блоге , которая касается передачи параметра в преобразователь значений в xaml. И этот блог дает некоторые подробности реализации конвертера значений.

5 голосов
/ 24 сентября 2008

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

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

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}"
  />
0 голосов
/ 24 сентября 2008

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

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

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

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

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