использование observableCollection в селекторе длинного списка

Я использую _wordItems в качестве источника элементов longlistselector, чтобы динамически удалять элементы в longlistSelector.

private ObservableCollection<Group<WordItem>> _wordItems = new ObservableCollection<Group<WordItem>>();

Класс Group определяется как:

public class Group<T> : ObservableCollection<T>
{
    public Group(string name, IEnumerable<T> items)
    {
        this.Key = name;
        foreach (T item in items)
        {
            this.Add(item);
        }
    }

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

    public string Key
    {
        get;
        set;
    }
}

и класс WordItem определяется как:

[Table]
public class WordItem //:INotifyPropertyChanged,INotifyPropertyChanging
{
    private int _wordItemId;
    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
    public int WordItemId
    {
        get
        {
            return _wordItemId;
        }
        set
        {
            if (_wordItemId != value)
            {
                _wordItemId = value;
            }
        }
    }

    private string _word;
    [Column(CanBeNull=false)]
    public string Word
    {
        get
        {
            return _word;
        }
        set
        {
            if (_word != value)
            {
                _word = value;
            }
        }
    }

    private string _wordExplains;
    [Column]
    public string WordExplains
    {
        get
        {
            return _wordExplains;
        }
        set
        {
            if (_wordExplains != value)
            {
                _wordExplains = value;
            }
        }
    }
}

когда я использую код _wordItems[1].RemoveAt(1);, _wordItems был изменен, и селектор длинного списка на экране также удалил определенный элемент. Но проблема в том, что когда я вызываю _wordItems[1].RemoveAt(1);, селектор длинного списка просто удаляет элемент _wordItems[1][0]. Когда я вызываю _wordItems[1].RemoveAt(0);, он просто удаляет заголовок второй группы и объединяет элементы в _worditems[1] с _wordItem[0].

Определение селектора длинного списка:

<toolkit:LongListSelector x:Name="WordsGroup" Background="Transparent"
                                              Margin="12,0,12,73" ItemTemplate="{StaticResource WordItemTemplate}"
                                              GroupHeaderTemplate="{StaticResource YoudaoGroupHeaderTemplate}"
                                              GroupItemTemplate="{StaticResource YoudaoGroupItemTemplate}" 
                                              SelectionChanged="WordsGroup_SelectionChanged"
                                              >
                        <toolkit:LongListSelector.GroupItemsPanel>
                            <ItemsPanelTemplate>
                                <toolkit:WrapPanel/>
                            </ItemsPanelTemplate>
                        </toolkit:LongListSelector.GroupItemsPanel>
                    </toolkit:LongListSelector>

Шаблон данных выглядит следующим образом:

   <DataTemplate x:Key="WordItemTemplate">
            <Border BorderBrush="Gray" BorderThickness="0,0,0,0" Margin="0,3,0,5">
                <StackPanel >
                    <toolkit:ContextMenuService.ContextMenu>
                        <toolkit:ContextMenu Opened="ContextMenu_Opened" >
                            <toolkit:MenuItem Header="delete this word" Click="DelectWord_Click"/>
                            <toolkit:MenuItem Header="share this word" Click="SMSShare_Click"/>
                        </toolkit:ContextMenu>
                    </toolkit:ContextMenuService.ContextMenu>
                    <TextBlock Text="{Binding WordItemId}" Style="{StaticResource PhoneTextNormalStyle}" Visibility="Collapsed"/>
                    <TextBlock Text="{Binding Word}" Style="{StaticResource PhoneTextNormalStyle}" FontSize="25" Foreground="Black" FontWeight="Bold"/>
                    <TextBlock Text="{Binding WordExplains}" Style="{StaticResource PhoneTextNormalStyle}"  Foreground="Black" TextWrapping="Wrap"/>
                </StackPanel>
            </Border>

        </DataTemplate>

        <DataTemplate x:Key="YoudaoGroupHeaderTemplate">
            <Border Background="#1BA1E2" Margin="0">
                <TextBlock Text="{Binding Key}" FontSize="30" Margin="12,0,0,0" Foreground="Black" />
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="YoudaoGroupItemTemplate" >
            <Border Background="#1BA1E2" Width="99" Height="99" Margin="6">
                <TextBlock Text="{Binding Key}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="40" Foreground="{StaticResource PhoneForegroundBrush}"/>
            </Border>
        </DataTemplate>

Спасибо заранее.

пс. Я использую linq как

var wordBy4sLetter = from word in wordList
                                         group word by word.Word.ToCharArray()[0].ToString() into s
                                         orderby s.Key
                                         select new Group<WordItem>(s.Key, s);
this._wordItems = wordBy4sLetter.ToObservableCollection();
                        this.WordsGroup.ItemsSource = this._wordItems;

person ellic    schedule 11.12.2011    source источник
comment
привет, Ричард, есть мысли по этому поводу?   -  person ellic    schedule 12.12.2011


Ответы (1)


Я думаю, вам нужен еще один ObservableCollection. Взгляните на принятый ответ на этот вопрос. Групповой список для Windows Phone 7?

Я изменил там код и создал новые методы добавления/удаления, которые будут создавать группу, если ее нет для добавления, и удалять группу, если она пуста при удалении.

person Josh Close    schedule 13.12.2011
comment
Я загрузил проект TVGuide, найдя его потрясающим приложением для Windows phone, но я просто запутался. Для меня это слишком сложно, чтобы понять использование класса LongListCollection. Любые другие мысли о причине, по которой пользовательский интерфейс Longlistselector удалил неправильный элемент? Спасибо. - person ellic; 14.12.2011