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

Связывание с элементом в WPF: может ли выражение Path использовать математику?

Я пытаюсь связать элемент управления с родительским свойством Height/width с помощью ElementName и Path. Однако я не хочу привязываться к фактической высоте, но ровно половину высоты. Может ли выражение Path выполнить математику?

например. Path={ActualHeight/2}

Я не мог найти способ сделать это. Есть ли другой умный подход?

Спасибо!

4b9b3361

Ответ 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}}"

Существует множество примеров, а также основные сведения о том, как использовать его на странице .