代码之家  ›  专栏  ›  技术社区  ›  viky

Wpf:我怎么知道TreeView是否更新了?

  •  1
  • viky  · 技术社区  · 15 年前

    有没有办法知道树什么时候更新?我尝试了与TreeView绑定的ObservableCollection的CollectionChanged事件,但没有成功。

    编辑:

    我的代码如下:

    class Temp
    {
        public void Load()
        {
            DeriveA d1 = new DeriveA();
            DeriveB d2 = new DeriveB();
            DeriveB d3 = new DeriveB();
            DeriveC d4 = new DeriveC();
            DeriveC d5 = new DeriveC();
            d1.Items.Add(d2);
            d1.Items.Add(d3);
            d2.Items.Add(d4);
            d2.Items.Add(d5);
            
            List = new ObservableCollection<object>();
            List.Add(d1);
            tree.ItemsSource = List;
    
            DeriveC d6 = new DeriveC();
            d3.Items.Add(d6);        //At this point, I want to know that List got updated
        }
        
        public ObservableCollection<object> List
        {
            get;
            set;
        }
    }
    
    class Base
    {
        ObservableCollection<Base> Items = new ObservableCollection<Base>();
    }
    
    class DeriveA : Base
    {
    }
    
    class DeriveB : Base
    {
    }
    
    class DeriveC : Base
    {
    }
    

    如何查找列表属性何时在任何级别更新?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Svetlozar Angelov    15 年前

    那怎么办 SourceUpdated 事件?


    SourceUpdated事件没有启动,但我尝试了ObservableCollection.CollectionChanged 它是好的,所以我想请你给一个小代码,这是我测试过的,希望它有帮助:

    public partial class Window1 : Window
    {
        ObservableCollection<string> items = new ObservableCollection<string>()
        {
            "string1","string2","string3","string4","string5"
        };
        public Window1()
        {
            InitializeComponent();
            DataContext = this;
            tree.ItemsSource = items;
            items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(items_CollectionChanged);
        }
    
        void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            MessageBox.Show("Event raised");
        }
    
    
        private void btnAddItem_Click(object sender, RoutedEventArgs e)
        {
            items.Add("string6");
        }
    }
    

    还有xaml

    <StackPanel Orientation="Vertical">
                <TreeView x:Name="tree" />
                <Button x:Name="btnAddItem" Click="btnAddItem_Click" Content="AddItem" />
    </StackPanel>
    
        2
  •  0
  •   Markus Hütter    15 年前

    你可以这样做:

    private void Loaded()
    {
        MyTreeNode d1 = new MyTreeNode();
        MyTreeNode d2 = new MyTreeNode();
        MyTreeNode d3 = new MyTreeNode();
        MyTreeNode d4 = new MyTreeNode();
        MyTreeNode d5 = new MyTreeNode();
        d1.AddNode(d2);
        d1.AddNode(d3);
        d2.AddNode(d4);
        d2.AddNode(d5);
    
        d1.CollectionChanged += (s, e) =>
        {
            MessageBox.Show("Tree Changed");
        };
    
        MyTreeNode d6 = new MyTreeNode();
        d3.AddNode(d6);
    }  
    
    public class MyTreeNode : ObservableCollection<MyTreeNode>
    {
        public void AddNode(MyTreeNode node)
        {
            this.Add(node);
            node.CollectionChanged += (s, e) => this.OnCollectionChanged(e);
        }
    }