WPF:如何绑定到集合中的一个项,而不使用ItemsControl,因为我不想显示所有项。

20

我有这样一个需求,我有一组物品(ObservableCollection),但我只想显示第一个物品。这个要求来自于大多数情况下,该集合只包含一个物品。由于空间限制,即使集合中有多个物品,我们也希望显示物品的数量、第一个物品的详细信息(与先前情况相同的呈现方式)和一个 ... 符号,提示用户还有更多的物品。当鼠标悬停在 UI 元素上时,弹出窗口最终会显示所有的物品。

我能想到的第一个解决方案(如果有更好的建议,请指出)是绑定到这个集合(但不使用 ItemsControl),并定义一个DataTemplateSelector派生类(根据集合中的项目数返回要显示的 DataTemplate,如只有一个物品则返回只显示这个物品的模板,否则返回带有 ... 和用于显示更多细节的弹出窗口的模板),然后将其用作 ContentTemplateSelector

但我的问题是:我的两个 DataTemplate 在 XAML 中应该是什么样子,以便它们可以只显示集合中的第一个物品?显然,我不能使用 ItemsControl

更新:

现在我已经成功解决了这个问题,并同意关闭此问题(由于已经有一些答案,我无法删除它)。

我实际上知道如何绑定到集合中的一个特定项,但这不是我困惑的地方。我觉得我应该像一个答案建议的那样使用 ContentControl。但我认为,由于我需要绑定到整个集合(而不是单个索引项),并使用 DataTemplateSelector 来选择正确的 DataTemplate,代码看起来会像这样:

<ContentControl Content="{Binding MyCollection}"
          ContentTemplateSelector="{StaticResource MyTemplateSelector}" />

MyTemplateSelector中,我不确定如何使用它,因为没有引用到我的集合,因为它被定义为资源,并且它没有MyCollection的信息。 不过,事实证明非常简单,DataTemplate可以引用索引项,而无需知道名称或任何其他引用。 就像这样:

<DataTemplate>
   <TextBlock Text="{Binding [0].PropertyName}" />
<DataTemplate />

1
可能是WPF绑定到集合中某些项的重复问题。 - Jon
如果其中一个答案帮助您解决了问题,请接受它,这样该问题就可以被标记为已回答。 - Sheridan
4个回答

35
为了将集合中的一个项目绑定到一个控件上,您可以使用以下语法:
{Binding Items[0]}

或者绑定到集合中单个项的属性:

{Binding Items[0].Property}

你可以通过访问MSDN网站上的 Binding.Path 属性页面了解有关属性路径语法的更多信息。以下是链接页面中的相关内容:

• 可以在属性名称后的方括号中指定属性的索引器。例如,子句 Path=ShoppingCart[0] 会将绑定设置为对应于属性内部索引处理文本字符串 "0" 的索引。还支持多个索引器。


11

试试这个

<ContentControl Content="{Binding YourCollection[0]}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

3

好的,虽然来晚了但我还是想分享我的两分钱:我建议用一个更简单的 (XAML-) 视图以及一个更接近你所需展示的内容的视图模型。

翻译:与其直接将现有的视图模型(或裸数据)及其项目集合映射到视图上,我建议将其映射为一个适当的视图模型,显示类似于 YourItemViewModel FirstItem 属性和一个 bool HasMore 属性。第二个视图模型很容易进行单元测试,以确保其正常工作,并且可以轻松地映射到具有较少逻辑的视图中,从而避免可能出现难以测试的视图问题。


0
  1. {Binding Items[0].SomeProperty}
  2. {Binding [0].SomeProperty}
  3. {Path=/SomeProperty}
这是与编程相关的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接