CollectionView with Expander找不到属性,虽然在扩展器头之外工作

时间:2014-07-29 20:59:00

标签: c# wpf

我正在开发一个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>

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

  

使用GroupDescriptions定义组时,视图对象   (CollectionViewSource对象或派生自的对象   CollectionView)将每个组包装在CollectionViewGroup对象中。

     

因此,当您自定义groupstyle时,您正在处理   CollectionViewGroup对象。您仍然可以访问原始数据   通过CollectionViewGroup的Items属性输入。 “Name”是CollectionViewGroup Object的属性。

原始来源:http://social.msdn.microsoft.com/Forums/vstudio/en-US/731a3230-65db-497e-afbb-6bb9f8b378d5/listview-grouping-with-expander?forum=wpf

也许尝试{Binding Name}代替{Binding callType}。正如评论所说,“Name”应该引用CollectionViewGroup.Name,最终应该映射到callType。

如果您需要更多信息,则会获得CollectionViewGroup.Items,其中应包含该特定组的所有必需项目。