我使用转换器为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-衬里,如果有什么更好的话,它必须只有一个行。)
答案 0 :(得分:-2)
您使用的是MVVM吗?因为如果您是,您可以随时在那里进行转换,只需公开包含要转换的项目的属性供UI使用。如果你不是,我建议你尝试一下。它将使您的代码更清洁。 =)