Двухходовой мультиконвертер или конвертер со свойством - PullRequest
1 голос
/ 23 ноября 2011

Мне нужно преобразовать значение из двух частей в строку и обратно, например:

{Value = 12.0, Units = DimensionUnits.Inches}

Преобразование в

"12 in"

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

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

http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ http://shujaatsiddiqi.blogspot.com/2011/02/wpf-binding-converter-parameter.html

Первый метод выводит ваш конвертер из Freezable вместо DependencyObject, чтобы разрешить DependencyProperties.Это работает и позволяет вам выполнять привязку в разделе Whwhat.Resources, но имеет очень странное поведение, как только прослушивание привязки при первом использовании во всем приложении.

Второй метод, похоже, неработать на всех.Свойство зависимости никогда не обновляется при изменении источника.

<pf:BindingReflector Target="{Binding Source={StaticResource DistanceConverter}, Path=Units, Mode=TwoWay}"
    Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=g:TestWindow, AncestorLevel=1}, Path=Units, Mode=TwoWay}"/>

Кто-нибудь знает решение этой проблемы или это большое ограничение WPF?

1 Ответ

3 голосов
/ 23 ноября 2011

Лично я бы посоветовал немного переосмыслить и сделать либо:

  1. Сохраните последнюю строку в одну сторону, используя IMultiValueConverter, и введите ее как два отдельных элемента. Это кажется разумным подходом, поскольку единицы представляют собой перечисление с определенным набором опций. Комбинированное окно для единиц и текстовое поле для количества кажется подходящим, и полное отображение может быть сделано с односторонним преобразователем.

  2. Обрабатывайте это преобразование явно во ViewModel. Это имеет то преимущество, что позволяет значительно улучшить обработку проверки, что, вероятно, потребуется, поскольку ввод двух отдельных значений (сумма + единицы) в одном элементе управления, скорее всего, не будет подтвержден правильно. Переместив логику прямо в вашу ViewModel вместо привязки к свойствам, вы можете корректно обрабатывать ошибки чистым способом.

...