2017-09-10 7 views
-2

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); 
} 

注:コードスニペットは、私の頭の上からです。

+0

と次のように完璧に取り組んでいます。それは単なる表示機構です。だから私は他のコントロールと同じようにあなたのitemsourceを使用し、単に値のページング表示を実装することをお勧めします。ここで私は高速のGoogle検索で見つけた例ですhttp://www.powerobjects.com/2013/02/19/wpf-paging-control-wpf-applications/ – Karolis

+0

はい、私も考えていることです。しかし、それは私の問題を解決しません:)このアプローチでも、私は同じ問題に直面します。 –

+0

たぶん私はそれを間違って読んでいるだけですが、ループを作成したように見えます。 'ItemsSource'を変更するだけで、' ItemsSource'プロパティを再び設定することができます。 'if'の中の' SetItemSource'にコードをラップすることができるので、指定された 'itemSource'インスタンスが現在のインスタンスと異なる* item *の場合にのみ行います。 –

答えて

-1

3日間の検索とこのStackOverflow投稿の後、私は間違いを見つけました。私のPageControlは自分自身のViewModel(DataContext)を持っていたため、PageControlのDataContextは自分のものだったので、MainWindow.xaml(またはPageControlを含むコントロール)のItemContourceを正しくバインドできませんでした。

これは、通常、ページングの実装はとにかく元のアイテムのソースを変更する伴わない変更

<DataGrid ItemSource={Binding ElementName=Pager, Path=RestrictedItemSource} /> 
<Pager x:Name="Pager" ItemSource={Binding Path=DataContext.Collection, RelativeSource={RelativeSource Mode=Find, AncestorType=UserControl}}" /> 
関連する問題