2012-10-12 127 views
2

當我使用GridView控件爲我的應用程序開發啓動屏幕時,遇到問題。我的主屏幕上有一個GridView,它的CollectionViewSource被設置爲ItemSource。將項目添加到嵌套列表後更新GridView

對於此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中添加了虛擬物品,並且提升了屬性changed,但網格保持不變。

我也嘗試在GroupViewModel類中觸發屬性更改的事件,當Items集合更改沒有任何運氣時。

編輯:正如我在評論中寫道,可以重新分配源屬性進行刷新,但是這會讓GridView再次呈現,這是不好的。我正在尋找可以帶來更好用戶體驗的選項。

+0

GroupCvs不爽快?我不積極,但我認爲它也必須是一個ObservableCollection,所以它知道集合已經改變 – dgarbacz

+0

不是的,是的。我無法將ObservableCollection綁定到我的gridview,因爲在這種情況下,我將擁有與我擁有的許多組一樣多的元素,但不會顯示子項。我查了一些例子,這是使用這個控件的'標準方式'。 – norbip

回答

2

我想CollectionViewSource不會對PropertyChanged事件做出反應。嘗試在修改它之後重新指定SourceGroupCvs。這不是優雅,但它應該工作:

GroupsCvs.Source = Groups; 

作爲最後的手段,你可以創建ObservableCollection<GroupViewModel>一個新的實例重新分配前:

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

謝謝,這可以工作,但是當我重新分配導致不太流暢的用戶體驗的源時,GridView會再次呈現。 – norbip

+0

我最終使用了這個解決方案。作爲補充,我把AddDeleteThemeTransition過渡到我的GridView,它隱藏了列表刷新時的眨眼。 – norbip

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

我剛試過,如果TwoWay綁定會使它工作,那就是爲什麼它在這裏。但它並沒有解決問題。 – norbip

相關問題