Silverlight:如何获取ItemsControl中的最后一项

3

我有一个ItemsControl。对于ItemsControl中的最后一项,我想隐藏包含逗号的TextBox。是否有一种使用XAML来实现这个目标的方法?

        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Visibility="{Binding Value, Converter={StaticResource NotEmpty}}">
                        <TextBlock Text="{Binding QuestionName}" />
                        <TextBlock Text=" " />
                        <TextBlock Text="{Binding Answer}"/>
                        <TextBlock Text=", " />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
2个回答

4

你能行吗?

<TextBlock Text=", " Visibility="{Binding LastItemVisibility}" />

在您的视图模型中,类似于以下内容:

public Visibility LastItemVisibility
{
    get { return MyCollection.LastOrDefault() == this ? Visibility.Collapsed : Visibility.Visible; }
}

?


现在你的ViewModel必须监听包含它的集合上的更改事件。这并不是世界末日,但确实会变得混乱。 - Jonathan Allen
1
@Jonathan Allen 是的,这是真的,但大多数视图模型都需要一些代码。;-) ...也许有点遗憾的是,对于这种非常普遍的情况,目前还没有解决方案。如果只有像您示例中的文本,我可能会使用一个简单的TextBlock和一个ValueConverter来执行String.Join(...)而不是使用ItemsControl。 - herzmeister
在现实生活中,我需要解决一些奇怪的格式问题。否则,我会将其设置为模型或视图模型上的只读属性。 - Jonathan Allen

1

很烦人,没有更简单的方法来使用转换器解决这个问题。实际上,如果您可以绑定到ConverterParameter(在Silverlight v4中不可能),您可以轻松地实现所需的效果。

如果您不想触及您的模型,我认为最好的选择是创建一个派生自ControlControl的新类,该类根据itemssource中绑定项的位置设置自己的可见性。虽然不是世界上最整洁的解决方案,但它可以保持模型的清洁。在ItemsControl中,它将如下所示:

  <local:ItemsControlVisibilityHelper ShowIfLast="False" ShowIfFirst="True"  ShowIfNotLastOrFirst="True"
                                                                    ItemsControl="{Binding ElementName=x_ItemsControl}"
                                                                    BoundItem="{Binding}"
                                                                    >
                                    <TextBlock Text=", "></TextBlock>
                                </local:ItemsControlVisibilityHelper>

这绝对是一个有趣的想法。我最终重写了父集合,但如果我没有这样做,我肯定会尝试这个方法。 - Jonathan Allen

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