Ответ 1
Я считаю, что вы можете сделать это с помощью конвертера значений. Вот запись блога в которой рассматривается передача параметра в преобразователь значений в xaml. И этот блог дает некоторые подробности о внедрении конвертера значений.
Я хочу добавить постоянное значение на входящее целое число. На самом деле у меня есть несколько мест, где я хочу привязываться к одному и тому же исходному значению, но добавляю разные константы. Поэтому идеальным решением было бы что-то вроде этого...
<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 получили какие-либо идеи?
Я считаю, что вы можете сделать это с помощью конвертера значений. Вот запись блога в которой рассматривается передача параметра в преобразователь значений в xaml. И этот блог дает некоторые подробности о внедрении конвертера значений.
Я использую 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)}"
Использование конвертера значений является хорошим решением проблемы, так как позволяет изменять исходное значение, поскольку оно связано с пользовательским интерфейсом.
Я использовал следующее в нескольких местах.
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, но на самом деле просто возвращает базовое значение, которое вы инициализировали "Карта" с добавлением к ключу.
public Integer get( Integer key ) { return baseInt + key; } // or some such
Без некоторой возможности передать номер из тега, я не вижу, как вы его получите, чтобы вернуть разные дельта из исходного значения.