Как применить конвертер одного элемента к свойству ItemSource? - PullRequest
1 голос
/ 31 августа 2010

Я настроил ItemSource для ListBox с конвертером:

<ListBox Name="FunctionsListBox"  
         ItemsSource="{Binding Path=Functions,
                       Converter={x:Static app:CreatorWindow.FunctionConverter}}"/>

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

Я знаю, что могу быть более сложным и определить ItemTemplate для ListBox:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Label Content="{Binding Converter={x:Static app:CreatorWindow.FunctionConverter}}"/>
    </DataTemplate>
</ListBox.ItemTemplate>

Но это мешает виджету, используемому ListBox, и он немного длинен.

Так как это сделать - коротко?Извините за разборчивость, мне просто нравится чистый код: -)

Не по теме

Поскольку я чувствую (и вижу), что ответы могут идти в совершенно неверном направлении, это мой FunctionConverter.

FunctionConverter = LambdaConverter.Create((GeneratorEnum e) => GeneratorsFactory.GeneratorNames[e],
                                           (string s) => GeneratorsFactory.GeneratorNames[s]);

Итак, у меня есть бэкэнд, где я могу получить доступ к данным, и он не зависит от пользовательского интерфейса, и у меня есть пользовательский интерфейс.Чтобы установить связь между backend и frontend, я использую конвертеры, как указано выше.Это минимальный подход к коду и он гибкий.

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

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

1 Ответ

0 голосов
/ 01 сентября 2010

Вы используете MVVM?Потому что, если это так, вы всегда можете выполнить там преобразование и просто предоставить свойство, содержащее преобразованные элементы, для использования пользовательским интерфейсом.Если нет, я предлагаю вам попробовать.Это сделает ваш код чище.=) * * Тысяча одна

...