2010-03-28 67 views
1

我有我的小設計器工具(我的程序)。以編程方式設置DataTemplate時的WPF/Silverlight綁定

左側有TreeView,右側有手風琴。

當我選擇一個節點時,我想根據選定節點的DataContext中的屬性動態構建Accordion Items。

選擇節點工作正常,當我使用這個示例代碼進行測試時,它也可以工作。

XAML代碼:

<layoutToolkit:Accordion x:Name="accPanel" 
         SelectionMode="ZeroOrMore" 
         SelectionSequence="Simultaneous"> 
    <layoutToolkit:AccordionItem Header="Controller Info"> 
    <StackPanel Orientation="Horizontal" DataContext="{Binding}"> 
     <TextBlock Text="Content:" /> 
     <TextBlock Text="{Binding Path=Name}" /> 
    </StackPanel> 
    </layoutToolkit:AccordionItem> 
</layoutToolkit:Accordion> 

C#代碼:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (e.NewValue != e.OldValue) 
    { 
     if (e.NewValue is SceneNode) 
     { 
     accPanel.DataContext = e.NewValue; //e.NewValue is a class that contains Name property 
     } 
    } 
} 

但是,當我試圖實現這一目標使用DateTemplate和動態地構建AccordingItem出現的問題,結合不工作:

<layoutToolkit:Accordion x:Name="accPanel" 
         SelectionMode="ZeroOrMore" 
         SelectionSequence="Simultaneous" /> 

and DataTemplate in my ResourceDictionary

<DataTemplate x:Key="dtSceneNodeContent"> 
    <StackPanel Orientation="Horizontal" DataContext="{Binding}"> 
     <TextBlock Text="Content:" /> 
     <TextBlock Text="{Binding Path=Name}" /> 
    </StackPanel> 
</DataTemplate> 

和C#代碼:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (e.NewValue != e.OldValue) 
    { 
    ResourceDictionary rd = new ResourceDictionary(); 
    rd.Source = new Uri("/SilverGL.GUI;component/SilverGLDesignerResourceDictionary.xaml", UriKind.RelativeOrAbsolute); 

    if (e.NewValue is SceneNode) 
    { 
     accPanel.DataContext = e.NewValue; 

     AccordionItem accController = new AccordionItem(); 
     accController.Header = "Controller Info"; 
     accController.ContentTemplate = rd["dtSceneNodeContent"] as DataTemplate; 

     accPanel.Items.Add(accController); 
    } 
    else 
    { 
     // Other type of node 
    } 
    } 
} 
+0

你能否展開「不工作」 - 異常,不正確的結果,什麼都沒有發生?你看到輸出窗口中有任何綁定錯誤嗎? – itowlson 2010-03-28 21:16:41

+0

Hello itowlson, 輸出中沒有任何異常或錯誤。 簡單地說,第一個「正確的」「靜態」示例顯示了「內容:場景根節點」,其中「場景根節點」來自名稱屬性。 第二個「錯誤」,「動態」示例僅向我顯示「內容:」。 而我不知道問題出在哪裏。 是的,我檢查了輸出窗口,沒有任何東西。 – 2010-03-28 21:34:26

回答

0

是否缺少呢?

accController.Content = e.NewValue; 

另外,我不認爲你需要使用的DataContext = 「{結合}」; DataContext將繼承。

+0

在這兩種情況下你都是對的。 我認爲設置 accPanel.DataContext = e.NewValue; 會傳播數據到項目,但我錯了,確實如此。 謝謝。 – 2010-03-29 20:23:04

相關問題