我正在开发一个C#WPF项目,我正在尝试使用CollectionView将元素组合在一起。
通过存储在数组中的XML消息读入数据。
以下是我用来处理数组的代码:
public void processCallLogInfo(string xml)
{
List<CallLogInformation> callLogInformationList = new List<CallLogInformation>();
string phoneNumber = null;
string contactName = null;
string contactPhoto = null;
XDocument doc = XDocument.Parse(xml);
var callLogInformationRoot = doc.Descendants("CallLogInformation");
foreach (var callLogInformation in callLogInformationRoot)
{
var callLogRoot = callLogInformation.Descendants("CallLog");
foreach (var log in callLogRoot)
{
var logRoot = log.Descendants("LogInformation");
foreach (var info in logRoot)
{
CallLogInformation callLogInfo = new CallLogInformation();
callLogInfo.contactInformation = new ContactInformation();
phoneNumber = info.Element("PhoneNumber").Value;
if (info.Elements("ContactPhoto").Any())
{
callLogInfo.contactInformation.photoBase64String = info.Element("ContactPhoto").Value;
}
if (info.Elements("ContactName").Any())
{
callLogInfo.contactInformation.contactName = info.Element("ContactName").Value;
callLogInfo.contactNameOrPhoneNumber = info.Element("ContactName").Value;
}
else
{
callLogInfo.contactNameOrPhoneNumber = phoneNumber;
}
callLogInfo.callType = info.Element("CallType").Value;
callLogInfo.date = long.Parse(info.Element("Date").Value);
callLogInfo.callDuration = Int32.Parse(info.Element("Duration").Value);
callLogInfo.contactInformation.phoneNumber = phoneNumber;
callLogInformationList.Add(callLogInfo);
//iCallLogManager.addCallLogItemToGUI(callLogInfo);
}
}
}
iCallLogManager.addArrayToGui(callLogInformationList);
}
以下是CallLogInformation类
public class CallLogInformation
{
public enum CallType { INCOMING, OUTGOING, MISSED, UNKNOWN };
public string contactNameOrPhoneNumber { get; set; }
public ContactInformation contactInformation {get; set;}
//public CallType callType { get; set; }
public string callType { get; set; }
public long date { get; set; }
public int callDuration { get; set; }
public CallLogInformation()
{
//callType = CallType.UNKNOWN;
}
}
下面是数组如何添加到集合视图
public void addArrayToGui(List<CallLogInformation> callLogInformationList)
{
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new System.Windows.Threading.DispatcherOperationCallback(delegate
{
ICollectionView callLogView = CollectionViewSource.GetDefaultView(callLogInformationList);
callLogView.GroupDescriptions.Add(new PropertyGroupDescription("callType"));
lstCallLogInformation.ItemsSource = callLogView;
return null;
}), null);
}
我正在尝试按callType属性进行分组,以便将调用分组为INCOMING / OUTGOING / MISSED
当我将扩展器部分代码放入其中时说它找不到属性callType但是如果我删除扩展器并且只是将callType添加到列表组而没有扩展器它可以工作,那么callType是定义工作所以我不明白为什么当使用扩展器时它有问题。
以下是WPF XAML
<ListView Height="397" HorizontalAlignment="Left" Margin="491,29,0,0" Name="lstCallLogInformation"
VerticalAlignment="Top" Width="320">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding callType}" FontWeight="Bold" Foreground="Gray" VerticalAlignment="Bottom" />
</StackPanel>
</Expander.Header>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
<GroupStyle />
</ListView.GroupStyle>
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel>
<TextBlock Text="{Binding contactNameOrPhoneNumber}" FontWeight="Bold" />
<TextBlock Text="{Binding callType}" />
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
感谢您提供的任何帮助。
答案 0 :(得分:1)
使用GroupDescriptions定义组时,视图对象 (CollectionViewSource对象或派生自的对象 CollectionView)将每个组包装在CollectionViewGroup对象中。
因此,当您自定义groupstyle时,您正在处理 CollectionViewGroup对象。您仍然可以访问原始数据 通过CollectionViewGroup的Items属性输入。 “Name”是CollectionViewGroup Object的属性。
也许尝试{Binding Name}
代替{Binding callType}
。正如评论所说,“Name”应该引用CollectionViewGroup.Name,最终应该映射到callType。
如果您需要更多信息,则会获得CollectionViewGroup.Items
,其中应包含该特定组的所有必需项目。