Wpf: Как я могу узнать, обновлен ли TreeView? - PullRequest
1 голос
/ 20 января 2010

Я использую Wpf TreeView, в этом я могу динамически добавлять TreeViewItems. Есть ли способ узнать, когда дерево обновляется? Я попытался с событием CollectionChanged ObservableCollection, которое я связал с TreeView, но это не сработало.

Edit:

Мой код такой:

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 обновляется на любом уровне?

Ответы [ 2 ]

1 голос
/ 20 января 2010

А как насчет SourceUpdated события?


EDIT Событие 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>
0 голосов
/ 20 января 2010

у вас может быть что-то вроде этого:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...