2012-09-03 44 views
0

我有一個要求在我們的應用程序之一實現下面列出。我有一個查詢如何在WPF中實現這一點。TreeView的對象綁定到另一個視圖

  1. 我有主要的WPF窗口,它分爲左側的樹視圖和窗體與一些文本框和組合框,右側的複選框。

  2. 我想用樹節點的標記值中存儲的對象的相應值填充右側窗體。

  3. 每當我點擊樹型視圖上的特定節點時,右側的表單字段將在其標籤值中顯示對象存儲的內容,如果我在右側表單字段中做了一些修改,最終會更新它。

任何人都可以給示例應用程序的鏈接?

回答

0

你的問題涉及WPF中的一個非常基本的概念,即(Data) Binding。請從這篇文章開始。

請注意,將有趣/可編輯的對象放入屬性TreeViewItem對於UI設計來說是一個非常糟糕的主意。 Tag屬性很容易從代碼中訪問,但是從UI中綁定到相當困難/完整,因爲TreeView本身只公開屬性,該屬性通常返回數據項而不是TreeViewItems

請這個例子玩:

<StackPanel Orientation="Horizontal"> 
    <TreeView x:Name="twi"> 
     <TreeViewItem Tag="one" Header="111"> 
      <TextBlock Text="First" /> 
     </TreeViewItem> 
     <TreeViewItem Tag="two" Header="222"> 
      <TextBlock Text="Second" /> 
     </TreeViewItem> 
     <TreeViewItem Tag="three" Header="333"> 
      <TextBlock Text="Third" /> 
     </TreeViewItem> 
    </TreeView> 
    <StackPanel Orientation="Vertical"> 
     <TextBlock Text="The text:" /> 
     <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem}" /> 
     <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag}" /> 
     <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Name}" /> 
     <TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Surname}" /> 
    </StackPanel> 
</StackPanel> 

這是整個樣本,只是把它的任何地方。左邊是項目,右邊是一些標籤。當您單擊TreeView時,標籤將更新並顯示所選內容以及其Tag屬性。當然,TAG被設置爲簡單的字符串,所以.Name和.Surname將不顯示任何內容。但是,如果將TAG設置爲某些數據對象,則會正確顯示。請注意,如果您點擊TWI,它會按照您的預期進行操作,但如果您點擊TWI的子項,它將不會 - 總而言之,它是選中的子文本!

您需要非常小心您在樹視圖中放置的內容,並且非常小心您放置標記值的位置/位置。這不是一個好方法。更典型的,你會:

public class Person 
{ 
    // properties 
    public string Name { .... } 
    public string Surname { ... } 

    public List<Person> Subordinates { .... } 
} 

<StackPanel Orientation="Horizontal"> 
    <TreeView x:Name="twi"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Subordinates}"> 
       <TextBlock> 
        <Run Text="{Binding Name}" /> 
        <Run Text=" " /> 
        <Run Text="{Binding Surname}" /> 
       </TextBlock> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

    <StackPanel Orientation="Vertical"> 
     <TextBlock Text="The selected person:" /> 
     <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Name, Mode=TwoWay}" /> 
     <TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Surname, Mode=TwoWay}" /> 
    </StackPanel> 
</StackPanel> 

和當然,創建一些示例數據,並提供到TreeView作爲其的ItemsSource。 通過這種方式,TreeView將自動創建項目,應用模板,並且每次點擊時,SelectedItem都不會爲您提供TreeViewItem s,但是 - Person可以直接編輯。因此,在窗口的右側,簡單綁定到SelectedItem.Name將「正常工作」,如果您將其設置爲雙向,它將直接更新Person。

聲明:我還沒有運行代碼。可能有錯誤和錯別字。代碼只是爲了展示大致的想法。

+0

嗨Quetzalcoatl,謝謝你這麼好的樣品。將測試此並接受爲答案。 – Omkar

相關問題