WPF / Silverlight: Могу ли я легко изменить свойство, к которому привязан? - PullRequest
1 голос
/ 23 марта 2011

Например:

 Width={Binding MyWidth}

Я бы хотел сделать:

 Width={Binding MyWidth/2}

Это не работает ... Мне интересно, есть ли простой способ сделать это. (без написания конвертера и без изменения или создания нового свойства)

Примечание: не обязательно для ширины .. Я говорю о свойствах в целом

Спасибо

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

Нет, вы не можете.

Вы должны написать преобразователь значений.Единственное, что вы можете сделать, это использовать строку формата для изменения формата.

Но вы могли бы написать многоцелевой конвертер, в котором вы могли бы указать параметр - это может быть даже какой-то сценарий, который вы придумали, чтобы вы могли использовать его для любых сценариев, например, для вашего подразделения.

2 голосов
/ 24 марта 2011

Я действительно должен был сделать это не так давно.Как сказал Руне, мне нужно было написать конвертер.Вы можете использовать мой, если хотите.

Пример использования:

Width="{Binding Width, Converter={StaticResource DoubleOffsetConverter}, ConverterParameter=50%}"

А вот и конвертер.Похоже, ваш вопрос требует только одностороннего преобразования, хотя я не думаю, что было бы слишком сложно реализовать ConvertBack, чтобы сделать его двусторонним, если это необходимо.

public class DoubleOffsetConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            double valueDouble = System.Convert.ToDouble(value);

            if (parameter != null)
            {
                string paramString = parameter.ToString();
                double paramDouble;
                if (paramString.EndsWith("%"))
                {
                    //
                    // Multiply by the percentage.
                    //
                    if (double.TryParse(paramString.Substring(0, paramString.Length - 1), out paramDouble))
                    {
                        return valueDouble * paramDouble / 100.0;
                    }
                }
                else if (double.TryParse(parameter.ToString(), out paramDouble))
                {
                    //
                    // Add the offset.
                    //
                    return valueDouble + paramDouble;
                }

            }
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 23 марта 2011

Определенно нет в Silverlight, ваши единственные варианты, как вы написали, - это либо конвертер, либо новое свойство.

Редактировать: только что отмеченный, кажется невозможным даже с WPF, используя эту статьюдля справки: http://www.codeproject.com/KB/WPF/WpfDataBinding1.aspx

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