2010-02-20 67 views
1

可以说我在画布中有一个ItemsControl。在项目控件的项目之间共享属性的最佳做法

每个项目都有自己的位置,但我希望所有项目都分享相同的宽度。所以如果用户在一个地方改变它,所有的项目都会被更新。 要做到这一点最干净的方法是什么?

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

  1. 每当设置发生变化时,我都会更新每个项目的宽度属性。缺点是,这需要更多的资源,但现在每个项目的视图只是绑定到这个属性。
  2. 我将宽度属性添加到绑定到包含项目的控件的ViewModel。我给ItemsControl一个名字(例如“MyItemsContainer”)。 现在每个项目可以通过得到它: {Binding ElementName=MyItemsContainer, Path=DataContext.Width}

与第二个解决方案的缺点是增加的依赖关系。首先必须有一个按该名称的ItemsControl(这使得不可能使用不同名称的ItemsControl中的项),而ItemsControl的DataContext需要有一个Width属性。

我希望找到替代解决方案或人们对两种解决方案的体验。

回答

1

如果你消除在尽可能高的水平(即父视图模型。)声明的属性冗余,您可以:

  • 有你ItemsControl每个项目子视图模型。这个子视图模型也可以公开相同的属性,但是转发对父视图模型的所有访问。请注意,这需要子视图模型也从父视图模型转发属性更改事件。您可以使用Truss,通过将孩子的财产绑定到父母的财产来使这更容易。
  • 您的观点使用BindingRelativeSource而不是ElementName,所以您至少要消除对具体名为ItemsControl的依赖关系。