2010-02-20 71 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的依賴關係。