オブジェクトの依存関係プロパティに対して行われたすべてのバインディングについて知る必要があるという問題があります。現在、データコンテキストが変更されるたびに依存関係のプロパティを繰り返し処理し、バインディング式を探しています。しかし、場合によっては(TabControls)、データコンテキストが最初に設定され、次にXAMLからのバインディングが適用されているように見えることがわかりました。
それで、依存関係プロパティの1つに適用されているバインディングを検出できる方法はありますか?
UserControl内にいると仮定すると、これにLoadedイベントを使用できるはずです。このイベントは、「要素がレイアウトされ、レンダリングされ、対話の準備ができた」ときに発生します。これは、バインディングが完了したことを意味しているとしか思えません。
次に、Loaded
イベントハンドラーで、データコンテキストにバインドしていることを通知するだけです。
データコンテキストが変更されることが予想される場合は、これをDataContextChanged
イベントハンドラーとも組み合わせる必要があります。
私は、yrdatacontextがいつ正しく変更されるかを知るためにprivatestaticDataContextChangedイベントを使用していると仮定します
これが私のコードの一部ですこれが私がしていることです
public static readonly DependencyProperty ApplicationDataContextProperty =
DependencyProperty.Register("ApplicationDataContext",
typeof(Object),
typeof(MyControl),
new PropertyMetadata(MyControl_DataContextChanged));
// my constructor
public MyControl()
{
InitializeComponent();
if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
SetBinding(ApplicationDataContextProperty, new Binding());
}
}
// my event
private static void MyControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
MyControl thisControl = sender as MyControl
if (thisControl != null)
{
INotifyPropertyChanged propertyChanged;
propertyChanged = e.OldValue as INotifyPropertyChanged;
if (propertyChanged != null)
propertyChanged.PropertyChanged -= thisControl.propertyChanged_PropertyChanged;
propertyChanged = e.NewValue as INotifyPropertyChanged;
if (propertyChanged != null)
propertyChanged.PropertyChanged += thisControl.propertyChanged_PropertyChanged;
}
}
// my 2e event
void propertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "ListWithUsers")
LoadGrid();
}
NotifyOnSourceUpdated
重要なバインディングで使用してみてください
http://msdn.microsoft.com/en-us/library/system.windows.data.binding.notifyonsourceupdated.aspx
または、PresentationTraceSourcesを使用して、出力ウィンドウで詳細なバインディング情報を取得することもできます。
例えば
<TextBlock Text="{Binding Name, PresentationTraceSources.TraceLevel=High}" />
プロパティが変更されたときにイベントを発生させることは、まさにINotifyPropertyChangedが行うことです。INotifyPropertyChangedを実装するために必要なメンバーが1つあり、それがPropertyChangedイベントです。
サンプルと詳細:プロパティの値が変更されるたびにイベントを発生させますか?