Привязка данных WPF с помощью простой арифметической операции?

StackOverflow https://stackoverflow.com/questions/125536

  •  02-07-2019
  •  | 
  •  

Вопрос

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

<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 Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/>

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

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

Это было полезно?

Решение

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

Другие советы

Я использую 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)}"

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

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

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}"
  />

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top