如何将单项转换器应用于ItemSsource属性?

时间:2010-08-31 19:40:08

标签: wpf data-binding converter itemssource

我使用转换器为ListBox设置了ItemSource:

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

然而,这对我来说很难看,因为转换器转换整个集合 - 我更喜欢更多功能的转换器,只转换单个项目。我可以写没有问题,但是如何强制ListBox逐个调用转换器,而不是一次调用所有项目?

我知道我可以更精细,并为ListBox定义ItemTemplate:

<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]);

所以我有后端,我可以访问数据,它是与UI无关的,我有UI。要在后端和前端之间建立链接,我使用上面的转换器。这是最小的代码方法,而且非常灵活。

GeneratorNames是具有唯一键和值的关联数组,因此您可以使用值或键作为索引来查询它。

之间添加新层并不能真正解决我的问题,不回答我的问题,即使我感兴趣它也会添加很多代码(这正是我不感兴趣的原因 - 上面你看到2-衬里,如果有什么更好的话,它必须只有一个行。)

1 个答案:

答案 0 :(得分:-2)

您使用的是MVVM吗?因为如果您是,您可以随时在那里进行转换,只需公开包含要转换的项目的属性供UI使用。如果你不是,我建议你尝试一下。它将使您的代码更清洁。 =)