【问题标题】:Updating a GridView after adding an item to a nested list将项目添加到嵌套列表后更新 GridView
【发布时间】:2012-10-12 17:13:41
【问题描述】:

当我使用 GridView 控件为我的应用程序开发启动屏幕时,我遇到了一个问题。我的主屏幕上有一个 GridView,它的 CollectionViewSource 设置为 ItemSource。

对于此 CollectionViewSource,源设置为 ObservableCollection 列表。每个 GroupViewModel 中都有一个 ObservableCollection。在代码中,重要部分如下所示:

public class StartPageViewModel : ViewModelBase
{
    public ObservableCollection<GroupViewModel> Groups { get; set; }
    public CollectionViewSource GroupsCvs { get; set; }     

    public StartPageViewModel()
    {
        // fill Groups with some mock data
        GroupsCvs.Source = Groups;
        GroupsCvs.IsSourceGrouped = true;
    }

    public void MoveItems(GroupViewModel grp)
    {
        // add a dummy item
        grp.AddRecipe(new ItemViewModel(new Item()) { Id = "123" });
        RaisePropertyChanged("GroupsCvs");
        RaisePropertyChanged("Groups");
    }
}

public class GroupViewModel : ViewModelBase, IEnumerable<ItemViewModel>
{ 
    public ObservableCollection<ItemViewModel> Items { get; set; }
}


View:

public sealed partial class MainPage : LayoutAwarePage
{
    private ViewModelLocator locator = new ViewModelLocator();

    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = locator.Main; // returns StartPageViewModel
    }
}

XAML part for MainPage, GridView

<GridView ItemsSource="{Binding GroupsCvs.View}" ...
</GridView>

当我将项目添加到组的集合时,如何刷新 UI?在我的 StartPageViewModel 中,我将虚拟项目添加到 GroupViewModel 并引发 propertychanged,但 Grid 保持不变。

我还尝试在 GroupViewModel 类中触发属性更改事件,当 Items 集合更改时没有任何运气。

编辑: 正如我在 cmets 中所写的,可以通过重新分配源属性来刷新,但是这会使 GridView 再次呈现,这并不好。我正在寻找能够带来更好用户体验的选项。

【问题讨论】:

  • GroupCvs 不刷新?我不是很肯定,但我认为它也必须是一个 ObservableCollection,这样它就知道集合已经改变了
  • 不是的,是的。我无法将 ObservableCollection 绑定到我的网格视图,因为在这种情况下,我将拥有与我拥有的组一样多的元素,不会显示子项。我检查了一些示例,这是使用此控件的“标准方式”。

标签: xaml windows-runtime winrt-xaml


【解决方案1】:

我想CollectionViewSourcePropertyChanged 事件没有反应。修改后尝试将Source 重新分配给GroupCvs。它并不优雅,但它应该可以工作:

GroupsCvs.Source = Groups;

作为最后的手段,您可以在重新分配之前创建ObservableCollection&lt;GroupViewModel&gt; 的新实例:

Groups = new ObservableCollection<GroupViewModel>(Groups)
GroupsCvs.Source = Groups;

【讨论】:

  • 谢谢,这可行,但是当我重新分配源时,GridView 会再次呈现,这会导致用户体验不太流畅。
  • 我最终使用了这个解决方案。作为补充,我将 AddDeleteThemeTransition 转换到我的 GridView 中,它隐藏了列表刷新时的闪烁。
【解决方案2】:
<GridView ItemsSource="{Binding GroupsCvs.View, **BindingMode=TwoWay**}" ...  
</GridView>

【讨论】:

  • 我只是尝试了 TwoWay 绑定是否可以使其工作,这就是它在这里的原因。但这并不能解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多