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

Wpf 如何将单项转换器应用于ItemSource属性?,wpf,data-binding,converter,itemssource,Wpf,Data Binding,Converter,Itemssource,我使用转换器为列表框设置ItemSource: <ListBox Name="FunctionsListBox" ItemsSource="{Binding Path=Functions, Converter={x:Static app:CreatorWindow.FunctionConverter}}"/> 所以我有后端,在那里我可以访问数据,它与用户界面无关,我有用户界面

我使用转换器为列表框设置ItemSource:

<ListBox Name="FunctionsListBox"  
         ItemsSource="{Binding Path=Functions,
                       Converter={x:Static app:CreatorWindow.FunctionConverter}}"/>
所以我有后端,在那里我可以访问数据,它与用户界面无关,我有用户界面。为了在后端和前端之间建立链接,我使用了如上所述的转换器。这是一种最小的代码方法,而且非常灵活

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


在中间添加新的层并不能真正解决我的问题,也不能回答我的问题,即使我感兴趣,它也会添加大量代码(这正是我不感兴趣的原因——上面您看到的是2-liner,如果有更好的,它必须只在一行中)。

您使用的是MVVM吗?因为如果是,您可以始终在那里进行转换,只需公开包含转换项的属性,供UI使用。如果你不是,我建议你试试。它将使您的代码更干净。=)

你说“干扰小部件”是什么意思?我给小部件贴上了标签。也许将来会有更多的小部件,而WPF for listbox将使用其他东西。这意味着此代码将导致非标准UI。依我看,我应该只改变数据的显示(转换)方式,而不是列表框用小部件填充其可视内容的方式。实际上这是个坏主意。后端不应该依赖前端——依赖后端是一项前端交易。所以后端应该公开“纯”值,前端负责以可读的方式呈现它。与我现在的代码完全相同。ViewModels不是后端。它们是表示层的一部分。它们是“视图模型”,包含视图需要显示的任何内容,包括转换后的数据。这里有一些关于这方面的更多信息:。我知道,我不知道如何让我的代码更干净——为了显示值,我所做的只是添加了两行代码(1行--convert,2行--convert back)。添加视图模型的中间层只会增加复杂性,因为现在我必须复制后端中的所有数据访问,仅转换。抽象和复杂的体系结构是好的,如果它们有目的的话,这里不是这样的。嗯,这个MVVM的事情是一个完全不同的讨论。但你比我更了解你的要求。所以,是的,在你的情况下,也许最好不要使用它。我添加了一些代码——任何证明它价值的方法都必须更加紧凑。看,我相信事实,而不是新的酷炫抽象的炒作:-)如果它更短,我感兴趣,如果不是-我不是:-)
<ListBox.ItemTemplate>
    <DataTemplate>
        <Label Content="{Binding Converter={x:Static app:CreatorWindow.FunctionConverter}}"/>
    </DataTemplate>
</ListBox.ItemTemplate>
FunctionConverter = LambdaConverter.Create((GeneratorEnum e) => GeneratorsFactory.GeneratorNames[e],
                                           (string s) => GeneratorsFactory.GeneratorNames[s]);