如何在XAML中绑定ListView的项数?

5

我遇到了一个将计数绑定到文本块的问题。

我有一个ListView,其项绑定到Users对象属性。我想获取所有已绑定项的计数。

这是我的ListView:

<ListView ItemsSource="{Binding Users}" x:Name="lvUsers">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ListViewItem IsHitTestVisible="False">
                <StackPanel>
                    <facebookControls:ProfilePicture Height="74" Width="74" ProfileId="{Binding FacebookId}" />
                    <TextBlock Text="{Binding UserName}" FontSize="18" HorizontalAlignment="Center" />
                </StackPanel>
            </ListViewItem>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是我的TextBlock:

<TextBlock Text="{Binding ElementName=lvUsers, Path=Items.Count, Mode=OneWay}" />

我做错了什么?

我知道如果我的ListView没有模板,只有ListViewItems,它就能工作,但我需要它是这样的。

1个回答

4

覆盖此ListView的模板。 下面的示例基本上创建了一个样式,其中它覆盖控件模板,使常规的ListView项(ItemsPresenter)包装在StackPanel中,以便可以在底部添加带有计数或其他内容的TextBlock

<ListView ItemsSource="{Binding Users}">
        <ListView.Style>
            <Style TargetType="{x:Type ListView}">
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border BorderThickness="1" BorderBrush="LightGray">
                                <StackPanel>
                                    <ScrollViewer>
                                        <ItemsPresenter />
                                    </ScrollViewer>
                                    <TextBlock Margin="0,4" FontWeight="Bold">
                                        <Run Text="Count: "/>
                                        <Run Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=Items.Count, Mode=OneWay}"/>
                                    </TextBlock>
                                </StackPanel>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>                    
            </Style.Setters>
        </Style>
        </ListView.Style>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ListViewItem IsHitTestVisible="False">
                    <StackPanel>
                        <facebookControls:ProfilePicture Height="74" Width="74" ProfileId="{Binding FacebookId}" />
                        <TextBlock Text="{Binding UserName}" FontSize="18" HorizontalAlignment="Center" />
                    </StackPanel>
                </ListViewItem>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

谢谢,但代码仍然无法工作。问题在于ListView中的ListViewItems,我该如何修复它? - Misha Zaslavsky
这个项目非常大,我无法全部放在页面顶部的第一条语句中,但我的代码确实在那里。 - Misha Zaslavsky
如果您想将一个列表视图放置在另一个列表视图中,您需要做的是覆盖第二个列表视图的模板。使用Blend提取它(从使用各种数据网格的经验来看,我对ListView的记忆正在消失),在控件模板中,您会发现一个Grid,在那里您可以添加额外的行,在其中添加您的TextBlock,以便作为该列表视图的一部分显示。 - denis morozov
2
你让我工作,同志!!!好吧,我已经发布了一个带有模板的更新,测试过了,这个可以用……祝你好运! - denis morozov
2
哦,好吧,如果您将ListView命名为<ListView x:Name="lv",然后绑定元素名称,那么这将起作用<Run Text="{Binding ElementName=lv, Path=Items.Count, Mode=OneWay}"/> - denis morozov
显示剩余2条评论

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