2012-09-12 1 views
1

WPF 트리 뷰가 있습니다.트리 뷰의 개체에 종속성 속성을 사용하여 트리 뷰를 업데이트하여 개체의 변경된 값을 표시하는 방법

<DockPanel Grid.Row="2" Margin="0,6,0,0" Grid.RowSpan="5" Height="491" VerticalAlignment="Top"> 
     <DockPanel.Resources> 

      <src:TreeViewFilter x:Key="MyList" /> 

      <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}"> 
       <TextBlock Text="{Binding Path=Name}" FontSize="16"/> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}"> 
       <TextBlock Text="{Binding Path=NameAndCount}" /> 
      </HierarchicalDataTemplate> 

     </DockPanel.Resources> 
     <TreeView Name="treeView1" Height="490" Width="235" VerticalAlignment="Top" ItemsSource="{Binding Source={StaticResource MyList}, UpdateSourceTrigger=PropertyChanged}" TreeViewItem.Selected="treeViewFilter" /> 
    </DockPanel> 

트리 뷰 정적 자원으로 myList에 결합 TreeViewParents 개체가 TreeViewFilter 클래스 생성된다 : (데이터를 검색하기 위해 불필요한 SQL 코드를 제거) 여기서 코드이다.

public class TreeViewFilter : ObservableCollection<TreeViewParent> 
{ 
    //three tree view parents that wont change 
    public TreeViewParent allOrders; 
    public TreeViewParent batchStatus; 
    public TreeViewParent shippedOrders; 
    static TreeViewFilter currentInstance1; //maybe set to null, can only create one instance! 

    public TreeViewFilter() 
    { 

     currentInstance1 = this; 

     //Create and fill out all orders tree filter 
     Add(allOrders = new TreeViewParent("All Orders", 0)); 

     //Create and fill out batch status tree filter 
     Add(batchStatus = new TreeViewParent("Batch Status", 0)); 
     int untouchedCount, batchReadyCount, errorCount; 

     OrderAttribute untouched = new OrderAttribute("Untouched", "Batch Status", 3, untouchedCount); 
     OrderAttribute batchReady = new OrderAttribute("Batch Ready", "Batch Status", 3, batchReadyCount); 
     OrderAttribute error = new OrderAttribute("Error", "Batch Status", 3, errorCount); 
     batchStatus.OrderAttributes.Add(untouched); 
     batchStatus.OrderAttributes.Add(batchReady); 
     batchStatus.OrderAttributes.Add(error); 

     OrderManager currentInstance = OrderManager.getCurrentInstance(); 
    } 

    public static TreeViewFilter getCurrentInstance() 
    { 
     return currentInstance1; 
    } 
} 

그러면 트리 뷰 부모가 주문 속성에 바인딩됩니다. Order Attributes는 자신의 Order Attributes 컬렉션을 가질 수 있습니다. (계층 필터링 트리보기) 여기

TreeViewParent 및 OrderAttribute 코드입니다 : (모두 비슷한입니다)

public class Base 
{ 
    public int classIdentifier; 
} 

공용 클래스 TreeViewParent : 자료 { 정적 TreeViewParent currentInstance;

public TreeViewParent(string name, int classIdent) 
    { 
     this._name = name; 
     this._orderAttributes = new ObservableCollection<OrderAttribute>(); 
     classIdentifier = classIdent; 
     currentInstance = this; 
    } 

    public string _name; 

    public string Name { get { return _name; } } 

    ObservableCollection<OrderAttribute> _orderAttributes; 
    public ObservableCollection<OrderAttribute> OrderAttributes 
    { 
     get { return _orderAttributes; } 
    } 

    public static TreeViewParent getCurrentInstance() 
    { 
     return currentInstance; 
    } 
} 

공용 클래스 OrderAttribute : 자료 { 공공 문자열 parentFilter; 정적 OrderAttribute currentInstance;

public OrderAttribute(string name, string parent, int classIdent) 
    { 
     _name = name; 
     parentFilter = parent; 
     classIdentifier = classIdent; 
     _orderAttributes = new ObservableCollection<OrderAttribute>(); 
     currentInstance = this; 
    } 

    public OrderAttribute(string name, string parent, int classIdent, int count) 
    { 
     _name = name; 
     parentFilter = parent; 
     classIdentifier = classIdent; 
     _count = count; 
     currentInstance = this; 
    } 

    string _name; 
    public int _count = 0; 

    public string Name { get { return _name; } } 

    public string NameAndCount 
    { 
     get 
     { 
      if (_count == 0) 
      { 
       return _name; 
      } 
      else 
      { 
       return _name + " (" + _count + ")"; 
      } 
     } 
    } 

    ObservableCollection<OrderAttribute> _orderAttributes; 
    public ObservableCollection<OrderAttribute> OrderAttributes { get { return _orderAttributes; } } 

    public static OrderAttribute getCurrentInstance() 
    { 
     return currentInstance; 
    } 
} 

업데이트 된 NameAndCount 데이터를 업데이트하고 프로그램이 실행되고 개수가 변경됨에 따라 동적으로 변경하려면 어떻게해야합니까?

답변

0

OrderAttribute 개체의 NameAndCount 속성이 변경된 시점 및보기가 이제 변경되어야합니다.

INotifyPropertyChanged 인터페이스를 구현하고 알림을 보낼 때마다 PropertyChanged 이벤트를 발생시켜야합니다.

예를 들어 _count 필드 값이 변경되면

public OrderAttribute : Base, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private int _count = 0; 

    public int Count 
    { 
     get { return _count; } 
     set 
     { 
      if(_count != value) 
      { 
       _count = value; 
       FirePropertyChanged("NameAndCount"); 
      } 
     } 
    } 
} 
+0

감사합니다. 아무도 그렇게 많은 코드로 대답 할 것이라고 생각하지 않았다 ... 고맙습니다! –

+0

또 다른 질문은, 똑같은 일을하고 싶지만 문자열 대신 부울 값을 사용하는 것입니다. 어떻게이 예가 바뀌 었습니까? –

관련 문제