【问题标题】:Wpf: How can I know if TreeView is Updated?Wpf:我怎么知道 TreeView 是否已更新?
【发布时间】:2011-01-07 04:37:00
【问题描述】:

我正在使用 Wpf TreeView,在此我可以动态添加 TreeViewItems。 有什么方法可以知道树何时更新?我尝试使用与 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
{
}

我如何知道 List 属性何时在任何级别更新?

【问题讨论】:

    标签: c# wpf events treeview


    【解决方案1】:

    你可以有这样的东西:

    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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

      • 不管用,谢谢回复!还有别的吗?
      • 我不知道你是否订阅了 CollectionChangedEvent,试试 List.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(List_CollectionChanged);和 void List_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { MessageBox.Show("Event raise"); }
      猜你喜欢
      • 2015-05-14
      • 2011-04-03
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多