Как создать привязку, которая включает в себя какую-то формулу? - PullRequest
3 голосов
/ 02 декабря 2009

Например, если у меня есть элемент, размер которого я хочу, чтобы он был вдвое больше размера другого элемента, как бы мне этого добиться?

Примером может быть следующий: mirroredObject - это объект, который я хочу использовать половину его ширины для ширины Border объекта.

<Border Width="{Binding ActualWidth, ElementName=mirroredObject, Mode=Default}" />

У меня есть другие ситуации, когда свойство, с которым я хотел бы связать, могло бы быть суммой ширин других элементов, как бы мне этого также добиться?

РЕШЕНИЕ

Пожалуйста, обратитесь к моему ответу для решения, которому помог ответ lenanovd.

Ответы [ 2 ]

6 голосов
/ 02 декабря 2009

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

Надеюсь, это поможет.

2 голосов
/ 02 декабря 2009

Спасибо levanovd за подсказку, как решить эту проблему. Вот мое решение этой проблемы, еще раз спасибо levanovd.

Создать конвертер

[ValueConversion(typeof(double), typeof(double))]
public class MultiplierConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (targetType != typeof(Double))
            throw new Exception("Conversion not allowed.");
        double f, m = (double)value;
        string par = parameter as string;
        if (par == null || !Double.TryParse(par, out f)) f = 1;
        return m * f;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        if (targetType != typeof(Double))
            throw new Exception("Conversion not allowed.");
        double f, m = (double)value;
        string par = parameter as string;
        if (par == null || !Double.TryParse(par, out f)) f = 1;
        return f == 0 ? float.NaN : m / f;
    }
}

Добавить конвертер в ваш XAML

<Window.Resources>
  <n:MultiplierConverter x:Key="MultiplierConverter"/>
</Window.Resources>

Добавить привязку между объектами, указав аргумент для множителя.

<StackPanel>
  <Rectangle x:Name="source" Width="100" Height="100" Stroke="Black"/>
  <Rectangle Width="100" Stroke="Black"
             Height="{Binding ActualWidth, ElementName=source, Mode=Default,
                              Converter={StaticResource MultiplierConverter},
                              ConverterParameter=2}"/>
</StackPanel>

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

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