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;
答案 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对属性的更改。