2011-08-12 10 views
10

私は、コントロールのグループに表示される前に、オブジェクトのリストをインターセプトして翻訳する必要のあるアプリケーションを作成しています。この目的のために、ObservableCollection型のDependencyPropertyを作成しました(BackupEntryはデータベースに関する情報を定義するカスタムクラスです)。私がしたいことは、コントロールがMVVMのObservableCollectionにバインドされることです。このコレクションは、コントロールを最初にロードするために使用できます。次に、コントロールインタフェースを介してエントリが追加されると、DependencyPropertyとして定義されている内部ObservableCollectionに追加され、バインドされているためMVVMのコレクションに表示されます。ObservableCollection as DependencyProperty

protected ObservableCollection<BackupEntry> _BackupItems = new ObservableCollection<BackupEntry>(); 

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register("BackupItems", typeof(ObservableCollection<BackupEntry>), typeof(ExplorerWindow)); 

public ObservableCollection<BackupEntry> BackupItems 
{ 
    get { return (ObservableCollection<BackupEntry>)GetValue(BackupItemsProperty); } 
    set { SetValue(BackupItemsProperty, value); } 
} 

public ExplorerWindow() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(ExplorerWindow), new FrameworkPropertyMetadata(typeof(ExplorerWindow))); 
    SetValue(BackupItemsProperty, _BackupItems); 
    _BackupItems.CollectionChanged += new NotifyCollectionChangedEventHandler(BackupItems_CollectionChanged); 
} 

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

とテストアプリでは:ここで私が使用しているコードです

<my:ExplorerWindow Name="ew" HorizontalAlignment="Left" VerticalAlignment="Top" Width="503" Height="223" BackupItems="{Binding BackupListItems}" /> 

私は私のテストのアプリで、画面上のボタンを作成しました。クリックすると、項目がBackupListItemsに追加されます。 BackupItems_CollectionChangedは呼び出されず、新しいアイテムは自分のコントロールのコレクションに表示されません。私は完全にここでトラックオフですか?これを実現するためには何が必要ですか?

+0

上記のコードはViewModelですか?もしそうなら、なぜあなたはPropertiesよりむしろDependencyオブジェクトを使用していますか –

+0

いいえ、上記のコードは私のコントロールのためのコードビハインドです。リストに入力されているデータとそれを表示するために使用されているコントロール間には直接の相関はありません。 DependencyObjectは、バインドできるようにリストを公開し、コントロールとの間でデータをやり取りするためのものです。 –

答えて

9

this questionのパターンに従う必要があります。上記のリンクに示すように、PropertyChangedハンドラー内のCollectionChangedイベントを購読する必要があります。

+0

それは完全に機能しました。早速のお返事ありがとうございます。 –

-1

コレクション変更イベントは、ExplorerWindowコンストラクタで設定したBackupItemのデフォルト値に対してのみサブスクライブされます。次に、既定の値をviewmodelのコレクションに置き換えます。これは購読していないコレクションです。プロパティが設定されるたびにcollectionchangedを購読する必要があります。 PropertyMetadataを受け入れるDependencyProperty.Registerのオーバーロードを使用して、プロパティが変更されたときのコールバックを提供できます。ここには大まかなスケッチがあります - それをコンパイルしていませんが、正しい方向に向けるべきです。

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register(
    "BackupItems", 
    typeof(ObservableCollection<BackupEntry>), 
    typeof(ExplorerWindow), 
    OnBackupItemsChanged); 

private void OnBackupItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var old = (ObservableCollection<BackupEntry>)e.OldValue; 
    if (old != null) 
    { 
     old.CollectionChanged -= BackupItems_CollectionChanged; 
    } 
    ((ObservableCollection<BackupEntry>)e.NewValue).CollectionChanged += BackupItems_CollectionChanged; 
} 

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

動作しません。 'DependencyProperty'は静的なものですが、' OnBackupItemsChanged'は静的なものではありません。 –

関連する問題