Как использовать переменную codebehind в качестве ввода для ConverterParameter в ValueConverter - PullRequest
3 голосов
/ 09 декабря 2010

У меня есть ListBox, где я устанавливаю ItemsSource в CollectionViewSource, который заполняется из службы WCF.Я использую конвертер значений в ListBox.ItemTemplate \ DataTemplate для преобразования свойства объектов в ItemsSource.

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

Для этого я хочу передать переменную уровня поля как ValuePvermeter преобразователя ValueConverter.Я пробовал несколько способов, в основном используя идеи из этого этого вопроса , за исключением того, что я всегда получаю сообщение об ошибке при синтаксическом анализе xaml (и приложение не загружается).

Одно исправление может добавитьСвойство для объектов в ItemsSource, но я не хочу этого делать.Частично потому, что этот объект используется в нескольких проектах, поэтому я не хочу менять i .... и потому что я хочу посмотреть, возможен ли другой метод.Также я считаю, что в wpf есть MultiValue Converter (и, возможно, SL 4.0), но я на SL 3.0.

Я думаю, что проблемы, которые у меня возникли до сих пор, из-за времени загрузки, привязки иразбор xaml.

Итак, несколько вопросов:

  • Можно ли это сделать, как я описал выше?
  • , если нет, в чем проблема?
  • если нет другого способа без добавления свойства к объекту?

1 Ответ

5 голосов
/ 09 декабря 2010

Мне не кажется, что вы хотите использовать привязку ConverterParameter в этом случае. Если я правильно вас понял, у вас есть одно значение на уровне UserControl, которое вы хотели назначить этому параметру, поэтому значение параметра для всех экземпляров будет одинаковым.

Вместо этого я хотел бы добавить свойство к самому коду конвертера.

 public class ExampleConverter : IValueConverter
 {

    public int SpecialValue { get; set; }

    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
             if (value.Equals(SpecialValue))
                 return "Special!";
             else
                 return value.ToString();
        }
        else
        {
             return null;
        }
    }

    public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Теперь вам нужно добавить этот конвертер в ресурсы UserControl: -

<UserControl.Resources>
   <local:ExampleConverter x:Key="conv" SpecialValue="-1" />
</UserControl.Resources>

Если вам нужно изменить значение в коде UserControl, вы будете использовать: -

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable;
...