我遇到一个问题,我需要知道所有绑定到我的对象的依赖属性的绑定情况。目前,每当我的数据上下文更改时,我都会迭代依赖属性并寻找绑定表达式。但是我发现在某些情况下(例如TabControl),数据上下文似乎首先设置,然后再应用来自XAML的绑定。
那么,有没有一种方法可以检测到绑定被应用到我的某个依赖属性上?
Loaded
事件处理程序中,您可以告诉数据上下文,您正在绑定它。DataContextChanged
事件处理程序。Loaded
和Unloaded
会在元素从可视树中加载/卸载时被调用,并且在该元素的生命周期内可能会多次发生这种情况(例如,主题更改可能会导致元素重新加载)。 - Grx70 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}" />