如何通过XAML中的某种条件绑定分组列表视图中的项目数

时间:2015-01-20 15:10:58

标签: wpf xaml listview

这就是我想要的

This is what I want

这就是我现在所拥有的

This is what I have now

区别在于每个小组标题上的数字。

我正在使用WPF构建即时消息软件。在上面的屏幕截图中,您可以看到联系人列表。它们按照与listview控件中的关系进行分组。在每个组的标题上,它显示组名(James Family,Friends)以及在线人员和组中成员的总数。例如0/2表示2个中的0个联系人在线。 1/1表示1个联系人在线,该组只有1个联系人。现在,我可以在xaml中绑定组名称(Binding Path = Name)和组中的成员总数(Binding Path = ItemCount),但无法绑定联机联系人的数量。

有人可以帮忙吗?

联系方式如下所示

public class Contact : INotifyPropertyChanged
{
    private string name;
    private string groupname;
    private bool isOnline;
    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }

    public string Groupname
    {
        get { return groupname; }
        set { groupname = value; OnPropertyChanged("Groupname"); }
    }

    public bool IsOnline
    {
        get { return isOnline; }
        set { isOnline = value; OnPropertyChanged("IsOnline"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

列表的xaml

                    <ListView HorizontalAlignment="Stretch" ItemsSource="{Binding Path=ContactSourceView}" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Auto">
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Margin" Value="0,0,0,5"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                                <Expander IsExpanded="False" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">
                                                    <Expander.Header>
                                                        <DockPanel LastChildFill="False">
                                                            <TextBlock Text="{Binding Path=Name}" FontSize="14" DockPanel.Dock="Left"/>
                                                            <TextBlock Text="{Binding Path=ItemCount}" HorizontalAlignment="Right" DockPanel.Dock="Right" Margin="0,0,5,0" Foreground="#FFC7C7C7"/>
                                                        </DockPanel>
                                                    </Expander.Header>
                                                    <Expander.Content>
                                                        <ItemsPresenter HorizontalAlignment="Stretch"/>
                                                    </Expander.Content>
                                                </Expander>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>
                    </ListView.GroupStyle>
        </ListView>

1 个答案:

答案 0 :(得分:0)

第一部分很简单,您拥有Items的{​​{1}}属性,并且您必须计算其中有多少是在线的,这是使用转换器完成的:

CollectionViewGroup

在线联系人TextBlock使用上述转换器:

public class ContactsToOnlineContactsCountConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int onlineContacts = 0;
        IEnumerable<object> groupItems = value as IEnumerable<object>;

        foreach (Contact contact in groupItems)
        {
            if (contact.IsOnline)
                onlineContacts++;
        }

        return onlineContacts;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

现在的问题是,在生成组并且上面的绑定未收到通知后,联系人可以更改其在线状态。解决方案可能是在联系人更改其在线状态时在<TextBlock Text="{Binding Path=Items, Converter={StaticResource ContactsToOnlineContactsCountConverter}}" /> 上调用Refresh方法。