【发布时间】: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