我编写了一个Interactivity Behavior(来自Blend SDK),可以附加到DataGrid,并根据DataGrid的DataContext中的ViewModel对DataGrid的列进行一些魔术。
由于DataContext可以在以后设置,我必须在行为中监听DataContext的变化。所以,我已经将DependencyProperty绑定到Associated DataGrid的DataContext,如下所示:
BindingOperations.SetBinding(this, SourceProperty, new Binding("DataContext") { Source = AssociatedObject });
此行被命中,因此绑定确实发生了。
现在棘手的部分: 如果我打电话
datagrid.DataContext = new MyViewModel();
一切都很完美。但是,如果datagrid包含在某些UserControl中(不一定是它的直接子节点)并且我想调用
this.DataContext = new MyViewModel();
Source属性的回调不会触发。我对它进行了调试,设置了datagrid.DataContext,因此DataContext是通过可视化树继承的,如果我手动调用行为更新,它确实会看到DataContext,但没有任何事情自动发生。
我不想命名DataGrid实例,我不想命名行为,因为在一个UserControl中可以有任意数量的那些,我想设置UserControl的DataContext并让DependencyProperty系统发挥其魔力。 / p>
我做错了什么?
答案 0 :(得分:2)
你有没有尝试过更简单的东西: -
BindingOperations.SetBinding(this, SourceProperty, new Binding());
这应该为您提供DataContext对象。没有Path
的绑定将返回源对象。没有明确Source
的绑定会返回当前DataContext
。
问题是DataContext
的{{1}}(行为)是否从其附加的this
获取其值?我认为可能会这样。