2

当我使用 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 集合更改时没有任何运气。

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

4

2 回答 2

2

我想CollectionViewSource不会对PropertyChanged事件做出反应。修改后尝试重新分配SourceGroupCvs它并不优雅,但它应该可以工作:

GroupsCvs.Source = Groups;

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

Groups = new ObservableCollection<GroupViewModel>(Groups)
GroupsCvs.Source = Groups;
于 2012-10-13T08:31:48.360 回答
0
<GridView ItemsSource="{Binding GroupsCvs.View, **BindingMode=TwoWay**}" ...  
</GridView>
于 2012-10-13T00:33:00.253 回答