VisibileItemsというDependencyPropertyを公開するユーザーコントロールがあります。そのプロパティが更新されるたびに、別のイベントをトリガーする必要があります。これを実現するために、PropertyChangedCallbackイベントを使用してFrameworkPropertyMetadataを追加しました。
何らかの理由で、このイベントは1回だけ呼び出され、次にVisibleItemsが変更されたときにトリガーされません。
XAML:
<cc:MyFilterList VisibleItems="{Binding CurrentTables}" />
CurrentTablesは、MyViewModelのDependencyPropertyです。CurrentTablesは頻繁に変更されます。別のWPFコントロールをCurrentTablesにバインドすると、UIに変更が表示されます。
これが、VisibleItemsをPropertyChangedCallbackで配線した方法です。
public static readonly DependencyProperty VisibleItemsProperty =
DependencyProperty.Register(
"VisibleItems",
typeof(IList),
typeof(MyFilterList),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(VisiblePropertyChanged))
);
public IList VisibleItems {
get { return (IList)GetValue(VisibleItemsProperty); }
set { SetValue(VisibleItemsProperty, value); }
}
VisiblePropertyChangedにステップインすると、CurrentTablesが最初に設定されたときにトリガーされることがわかります。しかし、その後の時間ではありません。
アップデート
CurrentTablesの変更方法について質問された方もいらっしゃると思いますが、変更時に完全に再割り当てされます。
OnDBChange()...
CurrentTables = new List<string>(MainDatabaseDataAdapter.GetTables(this.SelectedServer, this.SelectedDatabase));
この行は変更のたびに呼び出されますが、VisiblePropertyChangedハンドラーは最初にのみ呼び出されます。
アップデート
VisibleItemsを直接割り当てると、ハンドラーは毎回呼び出されます。
TestFilterList.VisibleItems = new List<string>( Enumerable.Range(1, DateTime.Now.Second).ToList().Select(s => s.ToString()).ToList() );
したがって、問題はDependencyProperty(VisibleItems)が別のDependencyProperty(CurrentTables)を監視していることに起因しているように見えます。どういうわけか、バインディングは最初のプロパティの変更では機能しますが、その後の変更では機能しませんか?あなたの何人かが示唆したように、スヌープでこの問題を調べようとしています。