这就是我想要的
这就是我现在所拥有的
区别在于每个小组标题上的数字。
我正在使用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>
答案 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
方法。