locked
Проблема с LongListSelector RRS feed

  • Общие обсуждения

  • Привет, All.

    Нужен список с группами, чтобы в нем можно было динамически добавлять и удалять группы и элементы в этих группах.

    Решил использовать LongListSelector + ObservableCollection<ObservableCollection<T>>

    Все создается, но список отображается криво. В чем может быть проблема? Или поправьте, если что не так.

    Заранее благодарю.

    Скриншоты и код в атаче. Сполеров не нашел, извиняйте :)

     

    <phone:PhoneApplicationPage 
        x:Class="TestApp.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
        <Grid x:Name="LayoutRoot" Grid.Row="1">
            <Grid.Resources>
                <DataTemplate x:Key="itemTemplate">
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Element}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                        <TextBlock Text="{Binding Type}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextSubtleStyle}"/>
                    </StackPanel>
                </DataTemplate>
                <DataTemplate x:Key="groupHeaderTemplate">
                    <Border Background="DarkGray" Height="72">
                        <TextBlock Text="{Binding Type}" TextAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40"/>
                    </Border>
                </DataTemplate>
                <DataTemplate x:Key="groupItemTemplate" >
                    <Border Background="DarkGray" Width="240" Height="120" Margin="6">
                        <TextBlock Text="{Binding Type}" TextAlignment="Center" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40"/>
                    </Border>
                </DataTemplate>
            </Grid.Resources>
            <toolkit:LongListSelector x:Name="Contacts" IsFlatList="False" ItemsSource="{Binding Items}"
                                      ItemTemplate="{StaticResource itemTemplate}"
                                      GroupHeaderTemplate="{StaticResource groupHeaderTemplate}"
                                      GroupItemTemplate="{StaticResource groupItemTemplate}"/>
        </Grid>
    </phone:PhoneApplicationPage>

    using System;
    using System.Windows;
    using System.ComponentModel;
    using Microsoft.Phone.Controls;
    using System.Collections.ObjectModel;
    using Microsoft.Phone.Tasks;

    namespace TestApp
    {
        
        public partial class MainPage : PhoneApplicationPage
        {
            public MainPage()
            {
                InitializeComponent();
                DataContext = new MainViewModel();
                this.Loaded += (object sender, RoutedEventArgs e) =>
                {
                    if (!((MainViewModel)DataContext).IsDataLoaded)
                    {
                        ((MainViewModel)DataContext).LoadData();
                    }
                };
            }
        }

        public class MainViewModel
        {
            public MainViewModel()
            {
                this.Items = new ObservableCollection<Group<ItemViewModel>>();
            }

            public ObservableCollection<Group<ItemViewModel>> Items { get; private set; }

            public bool IsDataLoaded
            {
                get;
                private set;
            }

            public void LoadData()
            {
                this.AddItem(new ItemViewModel() { Element = "Element 1", Type = "Type 1" });
                this.AddItem(new ItemViewModel() { Element = "Element 2", Type = "Type 2" });
                this.AddItem(new ItemViewModel() { Element = "Element 3", Type = "Type 3" });
                this.AddItem(new ItemViewModel() { Element = "Element 4", Type = "Type 4" });
                this.AddItem(new ItemViewModel() { Element = "Element 5", Type = "Type 1" });
                this.AddItem(new ItemViewModel() { Element = "Element 6", Type = "Type 2" });
                this.AddItem(new ItemViewModel() { Element = "Element 7", Type = "Type 3" });
                this.AddItem(new ItemViewModel() { Element = "Element 8", Type = "Type 4" });
                this.AddItem(new ItemViewModel() { Element = "Element 9", Type = "Type 1" });
                this.AddItem(new ItemViewModel() { Element = "Element10", Type = "Type 2" });
                this.AddItem(new ItemViewModel() { Element = "Element11", Type = "Type 3" });
                this.AddItem(new ItemViewModel() { Element = "Element12", Type = "Type 4" });
                this.IsDataLoaded = true;
            }

            private int CheckType(string Type)
            {
                for (int i = 0; i < this.Items.Count; i++)
                    if (this.Items[i].Type == Type)
                        return i;
                return -1;
            }

            public void AddItem(ItemViewModel Item)
            {
                int n = this.CheckType(Item.Type);
                if (n != -1)
                {
                    this.Items[n].Add(Item);
                }
                else
                {
                    Group<ItemViewModel> NewGroup = new Group<ItemViewModel>(Item.Type);
                    NewGroup.Add(Item);
                    this.Items.Add(NewGroup);
                }
            }
        }

        public class ItemViewModel
        {
            public string Element
            {
                get;
                set;
            }
            public string Type
            {
                get;
                set;
            }
        }

        public class Group<T> : ObservableCollection<T>
        {
            public Group(string name)
            {
                this.Type = name;
            }

            public override bool Equals(object obj)
            {
                Group<T> that = obj as Group<T>;
                return (that != null) && (this.Type.Equals(that.Type));
            }

            public string Type
            {
                get;
                set;
            }
        }
    }

    • Изменено Ravil Khabiakhmetov 6 июля 2012 г. 16:09 Удалил лишнее, уменьшил скрины
    • Изменен тип Abolmasov Dmitry 14 августа 2012 г. 6:25
    5 июля 2012 г. 12:58

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    10 июля 2012 г. 7:58
  • У меня твой код не заработал:

    26 сентября 2012 г. 11:21