Привязка к элементу в WPF: может ли выражение Path выполнить математику? - PullRequest
27 голосов
/ 03 мая 2010

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

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

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

Спасибо!

Ответы [ 5 ]

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

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

Height="{Binding ElementName=RootWindow, Path=ActualHeight,
                 Converter={StaticResource MathConverter},
                 ConverterParameter=@VALUE/2}"

Он также будет обрабатывать более сложные математические уравнения, такие как

Height="{Binding ElementName=RootWindow, Path=ActualHeight,
                Converter={StaticResource MathConverter},
                ConverterParameter=((@VALUE-200)*.3)}"
23 голосов
/ 03 мая 2010

Нет, нельзя использовать связывающие преобразователи

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;
  }
}
6 голосов
/ 05 декабря 2014

Нет, стандартная привязка не поддерживает выражения в 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 голосов
/ 17 октября 2014

@ 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();
        }
    }
}
1 голос
/ 11 ноября 2015

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

В частности, ваше выражение будет обработано так:

Height="{Binding ActualHeight, ConverterParameter=x/2, Converter={StaticResource math}}"

На домашней странице проекта .

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