将Silverlight UserControl绑定到复杂对象

3
什么是将复杂类绑定到用户控件以进行重用的“最佳”(或最常用)方法?
我正在尝试为类创建一些可重用库,但我不确定应该使用哪种方法。例如:我想创建一个地址库,定义一个地址类(具有Line1、Line2等属性)、验证逻辑和一个AddressControl,它作为查看器/编辑器,并为每个属性绑定字段。
在使用中,我可能会有一个客户类,具有BillingAddress、DeliveryAddress属性,我希望在我的客户控件中绑定这些属性,如下所示:
<addressLib:AddressControl [xxx]="{Binding BillingAddress}" />

所以问题是我应该在XXX中放什么?
最初,我考虑在控件上创建一个DependencyProperty 'Address':
<addressLib:AddressControl Address="{Binding BillingAddress}" />

但是现在我在想,我是否可以直接使用现有的DataContext属性呢?

<addressLib:AddressControl DataContext="{Binding BillingAddress}" />

这是最好的方法吗?是否存在任何问题,例如更新或NotifyPropertyChange问题?

非常感谢您的帮助!

2个回答

1
将您的控件的DataContext设置为您的模型(在本例中为BillingAddress)是正确的方法。如果您的控件用于ItemsControl的DataTemplate中,则DataContext当然只需为“{Binding}”。

1
一个需要记住的不同之处就是,使用依赖属性可以获得更改通知,而使用数据上下文则不行(至少在SL5之前是这样的)。

谢谢警告 - 我想我可能可以从控件中引发事件来指示更改。 - Quango
我已将其更改为正确的答案,因为使用DataContext不可靠,因为您不会收到更改通知。虽然这并没有错,但它使控件成为一次性绑定,并且如果父控件更改数据上下文,则不会更新。在我看来,这是相当有限的用例,因此依赖属性方法是正确的。 - Quango
如果有人感兴趣,这个答案:https://dev59.com/d0bRa4cB1Zd3GeqPxytc#2528018 展示了在控件中绑定值的最佳方法。 - Quango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接