私は、コントロールのグループに表示される前に、オブジェクトのリストをインターセプトして翻訳する必要のあるアプリケーションを作成しています。この目的のために、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は呼び出されず、新しいアイテムは自分のコントロールのコレクションに表示されません。私は完全にここでトラックオフですか?これを実現するためには何が必要ですか?
上記のコードはViewModelですか?もしそうなら、なぜあなたはPropertiesよりむしろDependencyオブジェクトを使用していますか –
いいえ、上記のコードは私のコントロールのためのコードビハインドです。リストに入力されているデータとそれを表示するために使用されているコントロール間には直接の相関はありません。 DependencyObjectは、バインドできるようにリストを公開し、コントロールとの間でデータをやり取りするためのものです。 –