假设我在画布中有一个ItemsControl。
每个项目都有自己的位置,但我希望所有项目共享相同的宽度。因此,如果用户在一个地方更改它,则所有项目都会更新。 最干净的方法是什么?
现在我看到2个解决方案。
{Binding ElementName=MyItemsContainer, Path=DataContext.Width}
第二种解决方案的缺点是增加了依赖性。首先,必须有一个名称的ItemsControl(这使得无法在不同名称的ItemsControl中使用该项),而ItemsControl的DataContext需要具有Width属性。
我有兴趣寻找替代解决方案或人们用这两种解决方案所取得的经验。
答案 0 :(得分:1)
如果通过在最高级别(即父视图模型)声明属性来消除冗余,则可以:
ItemsControl
中的每个项目制作子视图模型。此子视图模型还可以公开相同的属性,但转发对父视图模型的所有访问。请注意,这要求子视图模型也从父视图模型转发属性更改事件。您可以使用Truss通过将子项的属性绑定到父项来更轻松。Binding
而RelativeSource
代替ElementName
,这样您至少可以消除对特定名称ItemsControl
的依赖。