在项目控件的项目之间共享属性的最佳实践

时间:2010-02-20 15:00:38

标签: wpf data-binding

假设我在画布中有一个ItemsControl。

每个项目都有自己的位置,但我希望所有项目共享相同的宽度。因此,如果用户在一个地方更改它,则所有项目都会更新。 最干净的方法是什么?

现在我看到2个解决方案。

  1. 每当设置更改时,我都会更新每个项目的width属性。缺点是,这需要更多的资源,但现在每个项目的视图只是绑定到这个属性。
  2. 我向ViewModel添加了Width属性,该属性绑定到包含项目的Control。我给ItemsControl一个名字(例如“MyItemsContainer”)。 现在每个项目都可以通过以下方式获取: {Binding ElementName=MyItemsContainer, Path=DataContext.Width}
  3. 第二种解决方案的缺点是增加了依赖性。首先,必须有一个名称的ItemsControl(这使得无法在不同名称的ItemsControl中使用该项),而ItemsControl的DataContext需要具有Width属性。

    我有兴趣寻找替代解决方案或人们用这两种解决方案所取得的经验。

1 个答案:

答案 0 :(得分:1)

如果通过在最高级别(即父视图模型)声明属性来消除冗余,则可以:

  • ItemsControl中的每个项目制作子视图模型。此子视图模型还可以公开相同的属性,但转发对父视图模型的所有访问。请注意,这要求子视图模型也从父视图模型转发属性更改事件。您可以使用Truss通过将子项的属性绑定到父项来更轻松。
  • 让您的观点使用BindingRelativeSource代替ElementName,这样您至少可以消除对特定名称ItemsControl的依赖。