1

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

4

1 回答 1

-2

你在使用 MVVM 吗?因为如果你是,你总是可以在那里进行转换,只需公开一个包含转换项目的属性供 UI 使用。如果你不是,我建议你尝试一下。它会让你的代码更干净。=)

于 2010-08-31T20:59:04.993 回答