Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Wpf:我怎么知道TreeView是否更新了?_C#_Wpf_Events_Treeview - Fatal编程技术网

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

C# Wpf:我怎么知道TreeView是否更新了?,c#,wpf,events,treeview,C#,Wpf,Events,Treeview,我使用的是Wpf树视图,在这里我可以动态添加树视图项。 有没有办法知道树何时更新?我尝试了使用TreeView绑定的CollectionChanged事件ObservableCollection,但并没有成功 编辑: 我的代码如下所示: class Temp { public void Load() { DeriveA d1 = new DeriveA(); DeriveB d2 = new DeriveB(); DeriveB d

我使用的是Wpf树视图,在这里我可以动态添加树视图项。 有没有办法知道树何时更新?我尝试了使用TreeView绑定的CollectionChanged事件ObservableCollection,但并没有成功

编辑: 我的代码如下所示:

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
{
}
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);
    }
}
class-Temp
{
公共空荷载()
{
DeriveA d1=新的DeriveA();
DeriveB d2=新的DeriveB();
DeriveB d3=新的DeriveB();
DeriveC d4=新的DeriveC();
DeriveC d5=新的DeriveC();
d1.增加项目(d2);
d1.增加的项目(d3);
d2.项目。添加(d4);
d2.增加项目(d5);
列表=新的ObservableCollection();
列表。添加(d1);
tree.ItemsSource=列表;
DeriveC d6=新的DeriveC();
d3.Items.Add(d6);//此时,我想知道列表已更新
}
公共可观测收集列表
{
得到;
设置
}
}
阶级基础
{
ObservableCollection Items=新的ObservableCollection();
}
DeriveA类:基
{
}
派生类B:基
{
}
类DeriveC:Base
{
}
如何查找列表属性在任何级别更新的时间?

事件如何


编辑 SourceUpdate事件未触发,但我尝试了ObservaleCollection.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");
    }
}
公共部分类窗口1:窗口
{
ObservableCollection项=新的ObservableCollection()
{
“string1”、“string2”、“string3”、“string4”、“string5”
};
公共窗口1()
{
初始化组件();
DataContext=this;
tree.ItemsSource=项目;
items.CollectionChanged+=新系统.Collections.Specialized.NotifyCollectionChangedEventHandler(items\u CollectionChanged);
}
无效项\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show(“引发的事件”);
}
私有void btnAddItem_单击(对象发送者,路由目标e)
{
项目。添加(“第6条”);
}
}
还有xaml

<StackPanel Orientation="Vertical">
            <TreeView x:Name="tree" />
            <Button x:Name="btnAddItem" Click="btnAddItem_Click" Content="AddItem" />
</StackPanel>

这件事怎么办


编辑 SourceUpdate事件未触发,但我尝试了ObservaleCollection.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");
    }
}
公共部分类窗口1:窗口
{
ObservableCollection项=新的ObservableCollection()
{
“string1”、“string2”、“string3”、“string4”、“string5”
};
公共窗口1()
{
初始化组件();
DataContext=this;
tree.ItemsSource=项目;
items.CollectionChanged+=新系统.Collections.Specialized.NotifyCollectionChangedEventHandler(items\u CollectionChanged);
}
无效项\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
MessageBox.Show(“引发的事件”);
}
私有void btnAddItem_单击(对象发送者,路由目标e)
{
项目。添加(“第6条”);
}
}
还有xaml

<StackPanel Orientation="Vertical">
            <TreeView x:Name="tree" />
            <Button x:Name="btnAddItem" Click="btnAddItem_Click" Content="AddItem" />
</StackPanel>

您可以有如下内容:

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
{
}
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);
    }
}
private void Loaded()
{
MyTreeNode d1=新MyTreeNode();
MyTreeNode d2=新MyTreeNode();
MyTreeNode d3=新MyTreeNode();
MyTreeNode d4=新MyTreeNode();
MyTreeNode d5=新MyTreeNode();
d1.添加节点(d2);
d1.添加节点(d3);
d2.添加节点(d4);
d2.添加节点(d5);
d1.CollectionChanged+=(s,e)=>
{
MessageBox.Show(“树已更改”);
};
MyTreeNode d6=新MyTreeNode();
d3.添加节点(d6);
}  
公共类MyTreeNode:可观测集合
{
公共void AddNode(MyTreeNode节点)
{
添加(节点);
node.CollectionChanged+=(s,e)=>this.OnCollectionChanged(e);
}
}

您可以有如下内容:

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
{
}
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);
    }
}
private void Loaded()
{
MyTreeNode d1=新MyTreeNode();
MyTreeNode d2=新MyTreeNode();
MyTreeNode d3=新MyTreeNode();
MyTreeNode d4=新MyTreeNode();
MyTreeNode d5=新MyTreeNode();
d1.添加节点(d2);
d1.添加节点(d3);
d2.添加节点(d4);
d2.添加节点(d5);
d1.CollectionChanged+=(s,e)=>
{
MessageBox.Show(“树已更改”);
};
MyTreeNode d6=新MyTreeNode();
d3.添加节点(d6);
}  
公共类MyTreeNode:可观测集合
{
公共void AddNode(MyTreeNode节点)
{
添加(节点);
node.CollectionChanged+=(s,e)=>this.OnCollectionChanged(e);
}
}

它不起作用,无论如何,谢谢您的回复!还有什么吗?我不知道您是否订阅了CollectionChangedEvent,请尝试List.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(List\u CollectionChanged);和void List_CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e){MessageBox.Show(“引发的事件”);}它不工作,无论如何,感谢回复!还有什么吗?我不知道您是否订阅了CollectionChangedEvent,请尝试List.CollectionChanged+=new System.Collections.Specialized.NotifyCollectionChangedEventHandler(List\u CollectionChanged);和无效列表_CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e){MessageBox.Show(“引发的事件”);}