Windows Phone 7.1: Как добавлять и удалять элементы из элемента управления LongListSelector? - PullRequest
0 голосов
/ 12 октября 2011

Windows Phone 7.1: Как добавить / удалить элементы из элемента управления LongListSelector?

Я использую элемент управления LongListSelector из «Инструментария Windows Phone».Элемент управления - это данные, привязанные к ViewModel, унаследованной от ObservableCollection.Когда я пытаюсь использовать следующий код:

MyObject mo = new MyObject("Name", "Description", "Value");
App.MyObjectsViewModel.Add(mo);

Кажется, что ViewModel обновляется, но LongListSelector не обновляется?Чего мне не хватает?

PS: я новичок в разработке Silverlight и WP7.

После XAML для LongListSelector и DataTemplates.Код в значительной степени прямо из образца Windows Phone Toolkit (убрал некоторый код, связанный с форматированием, чтобы сохранить размер поста)

<DataTemplate x:Key="groupHeader">
    <TextBlock Text="{Binding Key}"/>
</DataTemplate>

<DataTemplate x:Key="groupItemHeader">
    <Border>
        <TextBlock Text="{Binding Key}" 
           Foreground="#FFFFFF" 
           FontSize="{StaticResource PhoneFontSizeLarge}"/>
        </Border>
</DataTemplate>

<DataTemplate x:Key="myobjectItemTemplate">
    <Grid>     
    <StackPanel VerticalAlignment="Top" Orientation="Vertical">
        <TextBlock Text="{Binding Symbol}"/>
        <TextBlock Text="{Binding Value}"/>
        <TextBlock Text="{Binding Description}" TextWrapping="Wrap"/>
    </StackPanel>
    </Grid>
</DataTemplate>

<controls:PivotItem Header="myobjects">
<toolkit:LongListSelector x:Name="myobjectsList" 
    Background="Transparent"
    GroupHeaderTemplate="{StaticResource groupHeader}"
    GroupItemTemplate="{StaticResource groupItemHeader}"
    ItemTemplate="{StaticResource myobjectItemTemplate}"
    GroupViewOpened="LongListSelector_GroupViewOpened"
    GroupViewClosing="LongListSelector_GroupViewClosing"/>
</controls:PivotItem>

C # код позади для установки ItemSource

var myobjectsByClassification = from myobjects in App.MyObjectsLibrary
        group myobjects by myobjects.Classification into c
        orderby c.Key
        select new PublicGrouping<string, MyObject>(c);

this.myobjectsList.ItemsSource = myobjectsByClassification;

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Я предполагаю, что код группировки вызывается только один раз где-то в коде позади. Таким образом, сгруппированная коллекция не обновляется при добавлении чего-либо в вашу коллекцию ViewModel. Самый простой способ справиться с этим (но, возможно, не самый элегантный) - создать собственный метод AddItem() для коллекции ViewModel.

class MyViewModelObject
{
  void AddItem( MyObject obj )
  {
    App.MyObjectsLibrary.Add( obj );
    MyObjectsByClassification = from myobjects in App.MyObjectsLibrary
                                group myobjects by myobjects.Classification into c
                                orderby c.Key
                                select new PublicGrouping<string, MyObject>(c);
  }
}

Свяжите MyObjectsByClassification с LongListSelector.ItemsSource в XAML и убедитесь, что вы уведомляете LongListSelector об изменениях свойства, используя INotifyPropertyChanged.

0 голосов
/ 12 октября 2011

Используя LINQ, объект, который вы фактически назначаете для ItemsSource, является IEnumerable<T>, а не ObservableCollection<T>.LINQ-to-objects не поддерживает автоматическое обновление через ObservableCollection.В конце концов, он возвращает только «вперед» IEnumerable<T>, а не коллекцию любого вида.

Измените вашу ViewModel, чтобы фактически выставлять ObservableCollection<PublicGrouping<string, MyObject>> и привязывайте ItemsSource непосредственно к этому.

...