2012-08-30 60 views
1

我做了一個投籃的應用程序來舉例說明我的問題:束縛樹狀部分清爽

繼承人的window1.xaml

<Window 
     x:Class="TreeViewStepByStep.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     mc:Ignorable="d" 
     Width="400" 
     Height="600"> 
     <Window.Resources /> 
     <Grid> 
      <TreeView 
       Margin="0,21,0,0" 
       ItemsSource="{Binding Regions}" 
       HorizontalAlignment="Left" 
       Width="221"> 

       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate 
         ItemsSource="{Binding Type}"> 
         <TextBlock 
          Text="{Binding Name}" /> 

         <HierarchicalDataTemplate.ItemTemplate> 
          <HierarchicalDataTemplate 
           ItemsSource="{Binding Locations}"> 
           <TextBlock 
            Text="{Binding Name}" /> 

           <HierarchicalDataTemplate.ItemTemplate> 
            <DataTemplate> 
             <TextBlock 
              Text="{Binding}" /> 
            </DataTemplate> 
           </HierarchicalDataTemplate.ItemTemplate> 

          </HierarchicalDataTemplate> 
         </HierarchicalDataTemplate.ItemTemplate> 

        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate> 

      </TreeView> 



      <Button 
       Content="Populate" 
       Height="23" 
       HorizontalAlignment="Left" 
       Margin="227,21,0,0" 
       Name="button2" 
       VerticalAlignment="Top" 
       Width="96" 
       Click="button2_Click" /> 
      <Button 
       Content="Add child" 
       Height="23" 
       HorizontalAlignment="Left" 
       Margin="227,49,0,0" 
       Name="button3" 
       VerticalAlignment="Top" 
       Width="96" 
       Click="button3_Click" /> 
      <Button 
       Content="Modify" 
       Height="23" 
       HorizontalAlignment="Left" 
       Margin="227,106,0,0" 
       Name="button4" 
       VerticalAlignment="Top" 
       Width="96" 
       Click="button4_Click" /> 
      <Button 
       Content="Add root level" 
       Height="23" 
       HorizontalAlignment="Left" 
       Margin="227,135,0,0" 
       Name="button5" 
       VerticalAlignment="Top" 
       Width="96" 
       Click="button5_Click" /> 
     </Grid> 
    </Window> 

而這裏的window1.xaml.cs

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes; 
    using System.Collections.ObjectModel; 

    namespace TreeViewStepByStep 
    { 
     /// <summary> 
     /// Interaction logic for Window1.xaml 
     /// </summary> 
     public partial class Window1 : Window 
     { 
      Collection<Region> regions; 

      public Window1() 
      { 
       InitializeComponent(); 
      } 

      private void button2_Click(object sender, RoutedEventArgs e) 
      { 
       Region sms = new Region("São Mateus do Sul") 
       { 
        Type = 
        { 
         new Types("Placemarks") 
         { 
          Locations = 
          { 
           "Pine trees", 
           "Barn", 
           "Phantom city" 
          } 
         }, 

         new Types("Planning") 
         { 
          Locations = 
          { 
           "Geada", 
           "Por do sol" 
          } 
         }, 
        } 
       }; 

       Region others = new Region("Outros") 
       { 
        Type = 
        { 
         new Types("Placemarks") 
         { 
          Locations = 
          { 
           "Road", 
           "Waterfall" 
          } 
         }, 
         new Types("Planning") 
         { 
          Locations = 
          { 
           "Moon" 
          } 
         }, 
        } 
       }; 

       regions = new Collection<Region>() { sms, others }; 

       DataContext = new 
       { 
        Regions = regions 
       }; 
      } 

      private void button3_Click(object sender, RoutedEventArgs e) 
      { 
       this.regions[1].Type.Add(new Types("New folder") 
              { 
               Locations = 
               { 
                "Test" 
               } 
              } 
             ); 
      } 

      private void button4_Click(object sender, RoutedEventArgs e) 
      { 
       this.regions[0].Name = "Edited"; 
      } 

      private void button5_Click(object sender, RoutedEventArgs e) 
      { 
       this.regions.Add(new Region("My new region")); 
      } 
     } 

     public class Region 
     { 
      public Region(string name) 
      { 
       Name = name; 
       Type = new ObservableCollection<Types>(); 
      } 

      public string Name { get; set; } 
      public ObservableCollection<Types> Type { get; set; } 
     } 

     public class Types 
     { 
      public Types(string name) 
      { 
       Name = name; 
       Locations = new ObservableCollection<string>(); 
      } 

      public string Name { get; private set; } 
      public ObservableCollection<string> Locations { get; set; } 
     } 


    } 

TreeView綁定到分層模型(區域變量)。當我點擊「填充」時,它將TreeView綁定到這個變量。當我點擊「添加孩子」時,它將一個子元素添加到綁定變量,並反映在TreeView上。到現在爲止還挺好。

當我嘗試修改現有元素的名稱或嘗試添加根級別節點(「修改」和「添加根級別」按鈕)時,會出現問題。這些修改是否也應該反映在TreeView上,因爲它是綁定到集合的?

回答

1

您需要將Collection類型更改爲ObservableCollection,並且需要在區域類上執行INotifyPropertyChanged,以便在編輯時向View發送通知。

C# 窗口類:

ObservableCollection<Region> regions; 

地區類別:

public class Region : INotifyPropertyChanged 
    { 
     public Region(string name) 
     { 
      Name = name; Type = new ObservableCollection<Types>(); 
     } 
     private string name; 
       public string Name 
     { 
      get { return name; } 
      set 
      { 
       name = value; 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
      } 
     } 

     public ObservableCollection<Types> Type { get; set; } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged = (s, e) => { }; 

     #endregion 
    } 
2

就像你現在所做的那樣,Collection在更改時不會通知視圖。您想要使用ObservableCollection而不是普通的Collection<T>ObservableCollection被編碼爲與UI一起工作,並確保視圖始終通過CollectionChanged事件進行更新。您使用ObservableCollection與其他一些,但您的區域變量是一個集合。

+0

這解決了創作的問題,但不能編輯之一。爲了自動反映節點上的編輯,我必須實現pchajer的解決方案。非常感謝你們兩位。 – RBasniak