C# Windows Phone 7.1:如何从LongListSelector控件添加和删除项目?
Windows Phone 7.1:如何从LongListSelector控件添加/删除项目 我正在使用“Windows Phone Toolkit”中的LongListSelector控件。控件是绑定到从ObservableCollection继承的ViewModel的数据。当我尝试以下代码时:C# Windows Phone 7.1:如何从LongListSelector控件添加和删除项目?,c#,silverlight,windows-phone-7,windows-phone,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); ViewMod
MyObject mo = new MyObject("Name", "Description", "Value");
App.MyObjectsViewModel.Add(mo);
ViewModel似乎已更新,但LongListSelector未更新?我错过了什么
PS:我是Silverlight和WP7开发的新手
遵循LongListSelector和DataTemplates的XAML。这段代码几乎是直接从WindowsPhoneToolkit示例中提取的,删除了一些与格式相关的代码,以保持文章的小型化
<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;
通过使用LINQ,您实际分配给ItemsSource的对象是IEnumerable而不是ObservableCollection。LINQ to对象不支持通过ObservableCollection自动更新。毕竟,它只返回向前的IEnumerable,而不是任何类型的集合
将ViewModel更改为实际公开一个ObservableCollection,并将ItemsSource直接绑定到该集合。我猜分组代码在代码隐藏的某个地方只被调用一次。因此,向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);
}
}
将MyObjectsByClass绑定到XAML中的LongListSelector.ItemsSource,并确保使用INotifyPropertyChanged通知LongListSelector对属性的更改。MyObjectsViewModel是否为ObservableCollection?是的,它是XAML后显示绑定的“ObservableCollection”,如果您在分组模式下使用LongListSelector,请发布代码以显示分组数据结构的创建方式。更新了帖子以显示XAML绑定和隐藏的代码。我尝试了类似的操作,但没有成功-没有更改LongListSelector视图。现在可以正常工作。我刚刚添加了另一行代码,以显式地将LongListSelector.ItemSource绑定到代码隐藏中的MyObjectsByClass。可能不是最优雅的解决方案,但它正在发挥作用。谢谢,谢谢!您能帮我提供一个示例代码来实现您推荐的功能吗。我试过。。。无法使其工作。@bharath-我需要查看ViewModel的简化版本才能编写示例。请记住,如果您计划在组首次创建后向组中添加其他项,则PublicGrouping将需要扩展ObservableCollection。我可以让它正常工作-现在它将满足我的目的。然而,您的回答有助于更好地理解LongListControl行为。非常感谢。我在windowsphonegeek.com上也找到了这样的网站,可以帮助其他有类似要求的人: