Связывание с элементом в WPF: может ли выражение Path использовать математику?
Я пытаюсь связать элемент управления с родительским свойством Height/width с помощью ElementName
и Path. Однако я не хочу привязываться к фактической высоте, но ровно половину высоты.
Может ли выражение Path
выполнить математику?
например. Path={ActualHeight/2}
Я не мог найти способ сделать это. Есть ли другой умный подход?
Спасибо!
Ответы
Ответ 1
Нет, вы не можете использовать привязывающие преобразователи
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return (int)value/2;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
Ответ 2
Я использую MathConverter
для выполнения математики в моих привязках XAML. Код конвертера можно найти здесь и он используется следующим образом:
Height="{Binding ElementName=RootWindow, Path=ActualHeight,
Converter={StaticResource MathConverter},
[email protected]/2}"
Он также будет обрабатывать более продвинутые математические уравнения, такие как
Height="{Binding ElementName=RootWindow, Path=ActualHeight,
Converter={StaticResource MathConverter},
ConverterParameter=((@VALUE-200)*.3)}"
Ответ 3
Нет, стандартная привязка не поддерживает выражения в Path. Но вы можете посмотреть мой проект CalcBinding, который был разработан специально для решения этой проблемы и некоторых других. Скажем, вы можете написать что-то вроде:
<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/>
или
<Label Content="{c:Binding A+B+C }" />
или
<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" />
где A, B, C, IsChecked - свойства viewModel, и он будет работать правильно
Гудлак!
Ответ 4
@Rachel MathConverter отлично поработал у меня, однако я отключил синтаксический анализ выражения и просто оставил этот бит в NCalc. Таким образом, мне не пришлось беспокоиться о приоритете оператора.
using NCalc;
using System;
using System.Globalization;
using System.Windows.Data;
namespace MyProject.Utilities.Converters
{
public class MathConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// Parse value into equation and remove spaces
string expressionString = parameter as string;
expressionString = expressionString.Replace(" ", "");
expressionString = expressionString.Replace("@VALUE", value.ToString());
return new Expression(expressionString).Evaluate();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Ответ 5
Взгляните на мой проект MathConverter
. Он позволяет использовать очень продвинутые выражения, включая форматирование строк.
В частности, ваше выражение будет обрабатываться как таковое:
Height="{Binding ActualHeight, ConverterParameter=x/2, Converter={StaticResource math}}"
Существует множество примеров, а также основные сведения о том, как использовать его на странице .