Windows Phone 7.1:如何添加&从LongListSelector控件中删除项目?

时间:2011-10-12 15:14:07

标签: c# silverlight windows-phone-7 windows-phone

Windows Phone 7.1:如何从LongListSelector控件添加/删除项目?

我正在使用'Windows Phone Toolkit'中的LongListSelector控件。该控件是绑定到从ObservableCollection继承的ViewModel的数据。当我尝试以下代码时:

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

ViewModel似乎确实更新但LongListSelector不会更新?我错过了什么?

PS:我是Silverlight和WP7开发的新手。

遵循LongListSelector和DataTemplates的XAML。代码非常直接来自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>

用于设置ItemSource的C#代码

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 :(得分:0)

通过使用LINQ,您实际分配给ItemsSource的对象是IEnumerable<T>而不是ObservableCollection<T>。 LINQ到对象不支持通过ObservableCollection自动更新。毕竟,它返回一个仅向前IEnumerable<T>而不是任何类型的集合。

将ViewModel更改为实际公开ObservableCollection<PublicGrouping<string, MyObject>>并将ItemsSource直接绑定到该帐户。

答案 1 :(得分:0)

我的猜测是分组代码仅在代码后面的某个地方被调用。因此,当您向ViewModel集合添加内容时,不会更新分组集合。处理此问题(但可能不是最优雅)的最简单方法是为ViewModel集合创建自己的AddItem()方法。

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);
  }
}

在XAML中将MyObjectsByClassification绑定到LongListSelector.ItemsSource,并确保使用INotifyPropertyChanged通知LongListSelector对属性的更改。