我用转换器为 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-liner,如果任何东西都更好,它必须只在一行中)。