ObservableCollection(すべての種類の種類)を定義された量に制限するためにPager Controlを作成するつもりです。したがって、私はDPを次のようにユーザーコントロールを作成しました:ItemSourceが変更された後に私の考えは、あるWPF - ObservableCollection <object> DP
public static readonly DependencyProperty ItemSourceProperty = DependencyProperty.Register("ItemSource", typeof(ObservableCollection<object>), typeof(PagerControl),new PropertyMetadata(null, ItemSourceChanged));
private static void ItemSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PageControl pageControl = (PageControl)sender;
PageControlViewModel viewModel = ((PageControlViewModel)pageControl.DataContext;
viewModel.SetItemSource(e.NewValue);
}
public ObservableCollection<object> ItemSource
{
get => (cast..)GetValue(ItemSourceProperty);
set => SetValue(ItemSourceProperty, value);
}
を、私のViewModelには、新しいコレクションを受信し、次のように登録することができるイベント
public void SetItemSource(ObservableCollection<object> itemSource)
{
this.ItemSource = itemSource;
this.ItemSource.CollectionChanged += doStuff;
}
doStuffありませんItemSource.Skip()。Take()をDataGridで使用できる他のObservableCollectionにバインドします。
これまでのところとても良いですが、私は次の問題に遭遇しました。 ItemSourceChangedは常に(バインドするとすぐに)呼び出され、ItemSource DPには既にインスタンスがあり、定義済みのデフォルト値ではありません。null。それは常にインスタンスを持っています。 PagerControlのItemSourceをObservableCollectionにいくつかの値でバインドすると、ItemSourceChangedにはエントリが全くなくなり、バインドされたオブジェクトと同じオブジェクトになりません。したがって、元のObservableCollectionが新しいエントリを受け取ったときには、CollectionChangedは呼び出されません。 XAML
<DataGrid ItemSource={Binding ElementName=Pager, Path=RestrictedItemSource} />
<Pager x:Name="Pager" ItemSource={Binding Collection} />
で
PagerControlの使用XAMLのViewModel
public ObservableCollection<Class> Collection { get; set; } = new ...();
public ViewModel()
{
Collection.Add(x);
Collection.Add(y);
Collection.Add(z);
}
注:コードスニペットは、私の頭の上からです。
と次のように完璧に取り組んでいます。それは単なる表示機構です。だから私は他のコントロールと同じようにあなたのitemsourceを使用し、単に値のページング表示を実装することをお勧めします。ここで私は高速のGoogle検索で見つけた例ですhttp://www.powerobjects.com/2013/02/19/wpf-paging-control-wpf-applications/ – Karolis
はい、私も考えていることです。しかし、それは私の問題を解決しません:)このアプローチでも、私は同じ問題に直面します。 –
たぶん私はそれを間違って読んでいるだけですが、ループを作成したように見えます。 'ItemsSource'を変更するだけで、' ItemsSource'プロパティを再び設定することができます。 'if'の中の' SetItemSource'にコードをラップすることができるので、指定された 'itemSource'インスタンスが現在のインスタンスと異なる* item *の場合にのみ行います。 –