将项添加到嵌套列表后更新GridView

时间:2012-10-12 17:13:42

标签: xaml windows-runtime winrt-xaml

当我使用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>

将Item添加到Group的集合时,如何才能刷新UI?在我的StartPageViewModel中,我将虚拟项添加到GroupViewModel并且我提升了propertychanged,但Grid保持不变。

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

编辑:正如我在评论中写的那样,可以通过重新分配源属性来刷新,但是这会再次渲染GridView,这不是很好。我正在寻找可以带来更好用户体验的选项。

2 个答案:

答案 0 :(得分:2)

我认为CollectionViewSourcePropertyChanged事件没有反应。修改后,尝试将Source重新分配给GroupCvs。它不优雅,但应该有效:

GroupsCvs.Source = Groups;

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

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

答案 1 :(得分:0)

<GridView ItemsSource="{Binding GroupsCvs.View, **BindingMode=TwoWay**}" ...  
</GridView>