2011-03-02 123 views
0

我有一個用戶控件,動態地嵌入一些基於類似DataTemplates的其他控件。WPF DataContext綁定不發生

我的控件的ViewModel具有綁定屬性,用於託管子控件的DataContext和ContentTemplate。然而,當我運行模板綁定罰款和初始化,但DataContext永遠不會被拿起,即使有一個DataContextChanged事件。

<ContentControl Name="SessionControl1" DataContext="{Binding SessionItem1}" ContentTemplate="{Binding Source={StaticResource ViewModel},Path=Session1Template}" /> 

現在,作爲一個測試,我把我想要的切換控制(AudioCard.xaml)之一,在同一個地方使用它直接像這樣嘗試:

<local:AudioCard DataContext="{Binding SessionItem1}" /> 

這工作得很好,控件將在動態情況下初始化,並且DataContextChanged事件以正確的綁定觸發。這導致我認爲綁定到ContentControl中的DataContext不起作用。

兩個問題: 1)有沒有簡單的方法來解決它?

2)有沒有更好的方法來做到這一點?

編輯:基於第一個回答,我改變了代碼看起來像這樣:

<ContentControl Name="SessionControl1" Grid.Row="0" Grid.Column="0" ClipToBounds="False" Height="128" Width="128" 
             DataContext="{Binding SessionItem1}" 
             ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}" /> 

我可以看到代碼進入我的內容模板選擇,但我在選擇對象爲空。我應該對其他東西有約束力嗎?

回答

1

至於Q2:

你爲什麼要綁定控件模板?

  1. 您可以簡單地創建一個DataTemplate「捕獲」的具體類型(在視圖模型的財產),並有前會顯示根據你自動把裏面的物體上的模板,無需綁定控件模板的需要好。

  2. 如果你持有的ControlTemplate財產在你的視圖模型(和它看起來像你這樣做),你違反了MVVM最重要的規則之一 - 視圖模型知道沒有關於查看,並持有沒有引用控制或UI什麼都沒有。

+0

好吧,我創建了一個模板選擇器類來獲取我的數據模板,將其作爲用戶資源放置在XAML中,所以我的綁定現在看起來像這樣:''我可以在模板選擇器類中斷點並看到它被調用,但是我對datacontext的綁定仍然是空的。 – 2011-03-03 14:09:46

2

確定的基礎上,XAML,並與正確的綁定使用數據模板選擇器的內容,而不是DataContext的的埃拉德的建議,這個代碼工作期望:

<ContentControl Name="SessionControl1" 
      Content="{Binding Source={StaticResource ViewModel},Path=SessionItem1}"           
      ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}" />