【问题标题】:Windows Phone 7.1: How to add & delete items from LongListSelector control?Windows Phone 7.1:如何从 LongListSelector 控件中添加和删除项目?
【发布时间】:2017-08-22 16:11:06
【问题描述】:

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;

【问题讨论】:

  • MyObjectsViewModel 还是ObservableCollection
  • 是的,它是'ObservableCollection'
  • 发布 XAML 以显示绑定,此外,如果您在分组模式下使用 LongListSelector,请发布代码以显示如何创建分组数据结构。
  • 更新了帖子以显示 XAML 绑定和背后的代码。

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


【解决方案1】:

我的猜测是分组代码只在代码后面的某个地方被调用一次。因此,当您向 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。

【讨论】:

  • 我确实尝试过类似的方法,但没有奏效 - LongListSelector 视图没有变化。
  • 这正在工作。我刚刚添加了另一行代码,在后面的代码中将LongListSelector.ItemSource 显式绑定到MyObjectsByClassification。可能不是最优雅的解决方案,但它正在工作。谢谢。
【解决方案2】:

通过使用 LINQ,您实际分配给 ItemsSource 的对象是 IEnumerable&lt;T&gt; 而不是 ObservableCollection&lt;T&gt;。 LINQ-to-objects 不支持通过ObservableCollection 自动更新。毕竟,它返回一个只转发的IEnumerable&lt;T&gt;,而不是任何类型的集合。

更改您的 ViewModel 以实际公开 ObservableCollection&lt;PublicGrouping&lt;string, MyObject&gt;&gt; 并将您的 ItemsSource 直接绑定到它。

【讨论】:

  • 谢谢!您能否帮我提供一个示例代码来实现您推荐的内容。我试过......无法让它工作。
  • @bharath - 我需要查看您的 ViewModel 的简化版本来编写示例。请记住,PublicGrouping 需要扩展 ObservableCollection,如果您计划在首次创建组后向组中添加其他项目。
  • 我能够让它工作——它现在可以满足我的目的。但是,您的回复有助于更好地理解 LongListControl 行为。谢谢你。我还在 windowsphonegeek.com 上找到了this post,这应该可以帮助有类似要求的其他人:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多