当我使用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,这不是很好。我正在寻找可以带来更好用户体验的选项。
答案 0 :(得分:2)
我认为CollectionViewSource
对PropertyChanged
事件没有反应。修改后,尝试将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>