2009-04-15 112 views
0

小背景:我從一個數據庫中加載一個WPF UI,該數據庫存儲在一個屬性表(控制類型,標籤,邊距等)中,我加載到一個類中,我調用了ControlPresenter。基本上,我將ControlPresenter設置爲ContentPresenter的DataContext,並使用TemplateSelector來選擇要加載的控件類型。 DataTemplate(s)將它們的屬性加載到ControlPresenter公開的DependencyProperties之外。如何實現「傳遞」DataBinding?

這一切都非常有效。當我嘗試在其他演示者(具有實現INotifyPropertyChanged的常規屬性)中將數據綁定到這些控件時(例如,TextBox的Text屬性爲演示者的Name屬性),我遇到的問題就出現了。該控件的DataContext是關聯的ControlPresenter,因此我不能直接綁定到其他演示者,並且我無法在同一個依賴項屬性上設置兩個綁定(我無法將控件和期望的演示者屬性綁定到同一個DP) 。

可能的解決方案:

  1. 我可以轉換所有其他主持人的使用移民(非常耗時而且容易導致與繼承問題)
  2. 我就可以使用兩個檢測點爲每個屬性我想要通過並嘗試通過更改通知將它們綁定在一起

這兩個看起來有問題並且容易打破,所以我希望別人提出了更好的s olution。

編輯:我想出了一個相當不錯的解決方案(見下文)。感謝大家看到這個,如果你想出一個比我更好的方法,請讓我知道。

回答

0

我最終通過將Binding.Source設置爲所需的ViewModel,然後使用數據庫中的Binding.Path路徑來設置代碼中的綁定。我將綁定存儲在字典(DependencyProperty,BindingBase)中,當控件加載時,我使用BindingOperations.SetBinding在控件上設置綁定。這似乎工作得很好,除了偶爾的操作順序問題(例如,如果在ItemsSource之前設置SelectedItem/SelectedValue,它將被設置,但不會顯示在ComboBox中)。

0

有幾種訪問作用域DataContexts的方法。

1)的ElementName綁定

這可能是最有用的,在最真實世界的場景,你正在試圖綁定到超出名稱範圍的反正。但只要框架元素位於名稱範圍內,它就是訪問並行或父級數據上下文的一種方式。

<TextBox Text="{Binding ElementName=ControlSomewhereElseBoundToSomeOtherControlPresenter, Path=DataContext.SomeTextPropertyOnTheControlPresenter}" /> 

2)的RelativeSource綁定

這類似於#1,但使用的RelativeSource到導航到相應的視覺元素和抓住的DataContext。當然,這假設您正試圖獲取的DataContext位於您目前位於Visual Tree中的哪個位置。

3)使用靜態繼電器

你可以充當門面您的視圖模型的靜態類中暴露你的替代ControlPresenters。然後,在通過靜態方法/屬性的每個ViewModel構造實例屬性中。這是跨多個View模型實現共享存儲的常用方法。我意識到這種技術需要你改變你的模式,但是在這些「ControlPresenter」類中添加一個簡單的ViewModel包裝器似乎比你描述的選項簡單得多。

+0

嗯,我得看看我是否可以得到選項3號的工作。 – 2009-04-16 13:36:30

相關問題