【发布时间】:2011-04-06 11:15:30
【问题描述】:
我用转换器为 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-班轮,如果有更好的,它必须只在 一个 行)。
【问题讨论】:
-
“干扰小部件”是什么意思?
-
我放了标签小部件。也许将来会有更多的小部件,列表框的 WPF 将使用其他东西。这意味着此代码将导致非标准 UI。 IOW 我应该只更改数据显示(转换)的方式,而不是列表框使用小部件填充其可视内容的方式。
标签: wpf data-binding converter itemssource