【问题标题】:How to apply single item converter to ItemSource property?如何将单项转换器应用于 ItemSource 属性?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 实际上是个坏主意。后端不应该依赖前端——依赖后端是前端的交易。所以后端应该暴露“纯”值,前端有责任以可读的方式呈现它。就像我现在的代码一样。
  • ViewModel 不是后端。它们是表示层的一部分。它们是“视图模型”,包含视图需要呈现的任何内容,包括转换后的数据。以下是有关此的更多信息:groups.google.com/group/wpf-disciples/browse_thread/thread/….
  • 我知道,我不知道如何让我的代码更清晰——显示值我所做的只是添加两行代码(1 行——转换,2 行-- 转换回来)。添加视图模型的中间层只会增加复杂性,因为现在我必须复制我在后端拥有的所有数据访问,只进行转换。抽象和复杂的架构如果有目的是好的,但这里不是这样。
  • 好的。好吧,这个 MVVM 事情完全是一个不同的讨论。但你比我更了解你的要求。所以是的,在你的情况下,也许最好不要使用它。
  • 我添加了一些代码——任何证明其价值的方法都必须更加紧凑。 IOW 我相信事实,而不是新的酷抽象的炒作 :-) 如果它更短,我很感兴趣,如果不是 - 我不是 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2013-03-23
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多