1

我编写了一个自定义 Silverlight 3 控件,它使用一个类作为其数据上下文(MVVM 模式)。我想通过 XAML 将此控件放在另一个控件(窗体)上。子控件公开了一个依赖属性,当通过 XAML 设置时,它将使其显示详细信息。

所以一个例子是子控件显示订单详细信息数据,我想把它放在一个显示用户订单的表单上。当您选择一个订单时,父控件(订单列表)上的选定项值是绑定到子控件的数据,以显示详细信息。

问题是子控件的依赖属性的 OnChanged 处理程序永远不会被调用。如果我没有在孩子上设置数据上下文(因此它使用父数据上下文)一切正常,但是当我设置不同的数据上下文时,它就会崩溃。

4

3 回答 3

0

所以我想了更多,我理解正在发生的事情,但我认为它非常混乱,而且做得不对。如果我在主页中的控件上进行数据绑定,它应该使用该页面的上下文来进行绑定。我在控件内部进行的绑定应该使用控件的上下文。

无论我将绑定表达式放在哪里,它现在的工作方式都使用控件的上下文(除非我正在进行 E2E 绑定,然后它使用主页的上下文)。这对我来说很愚蠢。但至少我现在明白了。

我使用元素到元素绑定解决了这个问题,并让它工作。我希望 SL 团队会改变这种行为。

于 2009-07-06T20:02:11.000 回答
0

理想情况下,您的 ViewModel 将用于外部 UserControl,而 ViewModel 上的属性将是 Inner/Child userControl 的 DataContext

于 2009-06-18T14:21:00.727 回答
0

确实,当父控件的 DataContext 设置时,它会向下传播到其所有子控件。但是子控件可以选择通过设置自己的 DataContext 来覆盖此行为(您在示例中似乎正在这样做)。因此,根据偏好规则,子控件的 DataContext 被赋予更多的偏好,因此它会覆盖父控件的。此外,由于孩子的 DataContext 在最初设置后永远不会改变,因此 DP 永远不会被调用。

于 2009-06-18T19:02:36.797 回答