2

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 にダミー項目を追加し、propertychanged を発生させますが、Grid は同じままです。

また、Items コレクションが運もなく変更されたときに、GroupViewModel クラスでプロパティ変更イベントを発生させようとしました。

編集:コメントに書いたように、ソース プロパティを再割り当てして更新することは可能ですが、これにより GridView が再度レンダリングされますが、これは適切ではありません。より良いユーザーエクスペリエンスをもたらすオプションを探しています。

4

2 に答える 2

2

イベントCollectionViewSourceには反応しないと思います。PropertyChanged変更した後、に再割り当てSourceしてみてくださいGroupCvs。エレガントではありませんが、うまくいくはずです:

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 に答える