【发布时间】:2011-11-06 07:36:03
【问题描述】:
问题是我总是想针对 DataContext 属性绑定控件。因为我不喜欢在 Binding 表达式中指定 Source。但是,我不想显式绑定控件的 DataContext 属性,而是使用另一个指定的自描述属性,例如 Items 或 Plugins 或任何控制目的。 现在,只要设置了真正确定控件上下文的自描述属性,我就需要一种方法来设置 DataContext 属性。此外,我希望 DataContext 始终与此属性相同。如何做到这一点?
我尝试使用回调指定 PropertyMetadata,该回调会将 DataContext 设置为新收到的值。它不起作用。首先,因为没有为属性的默认值调用此回调。其次,最有趣的是,我观察到了非常奇怪的行为。让我使用调用堆栈来解释这一点:
这是我的 PropertyMetadata,回调中有断点:
new PropertyMetadata((d, e) => ((SearchSettings)d).DataContext = e.NewValue)
这是调用栈(行尾有 cmets):
3. Bla-bla-bla.SearchSettings..cctor.AnonymousMethod__7(DependencyObject d, DependencyPropertyChangedEventArgs e) /* Setting property back to null. Why??? */
2. [External Code]
1. Bla-bla-bla.SearchSettings..cctor.AnonymousMethod__7(DependencyObject d, DependencyPropertyChangedEventArgs e) /* This is where the breakpoint hit first. Settings a new value to a property as a result of databinding. */
那么,我该怎么做呢?或者我应该想要这样做吗?顺便说一句,我是 WPF 的新手,所以我可能会弄错。
【问题讨论】:
-
你想用你的依赖属性实现什么?为什么将页面 DataContext 设置为某些属性的新值,而不是在页面上设置具有相同值的某些属性并绑定到该值?
-
比起
Items={Binding ElementName=me, Path=User.Name},我更喜欢Name={Binding Path=Name}。据我所知,这只有在DataContext属性等于User属性时才有可能。因此,我希望DataContext属性等于User。 -
这可能被重置为 null 的原因可能是因为
DataContext属性正在更改。这将流向设置绑定的控件。然后假设绑定被指定为TwoWay,然后将告诉控件更新它的Binding source,然后它会流回到PropertyMetadata对象中指定的PropertyChangedCallback。这不会让您陷入无限循环的原因是因为在幕后进行的值检查。 -
您只能使用 ElementName 绑定到 XAML 中控件的属性。这是你想要做的吗?例如,一个控件试图将它的一个属性设置为另一个控件的值?
-
我就是不明白。你想做什么?你能再展示一些代码/XAML 来澄清一下吗?
标签: wpf data-binding