Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 为什么我的第二个ObservaleCollection正在获得更新?_C#_Wpf_Treeview_Observablecollection_Treeviewitem - Fatal编程技术网

C# 为什么我的第二个ObservaleCollection正在获得更新?

C# 为什么我的第二个ObservaleCollection正在获得更新?,c#,wpf,treeview,observablecollection,treeviewitem,C#,Wpf,Treeview,Observablecollection,Treeviewitem,我有两个可观察集合,其中填充了相同类型的项(这些项也是填充了其他类型对象的可观察集合) \u TreeView数据库-第一个可观察到的收集是所有数据的“基础” \u TVData-第二个ObservableCollection应该只存储“需要”的项目,我还使用绑定到TVData的ItemSource进行了TreeView 函数FillAliasTreeView仅用于用数据填充_TreeView数据库,因此我不会在此处粘贴代码 在程序开始时,I将\u TreeViewBase分配给加载边栏()中的

我有两个可观察集合,其中填充了相同类型的项(这些项也是填充了其他类型对象的可观察集合)

\u TreeView数据库-第一个可观察到的收集是所有数据的“基础”

\u TVData-第二个ObservableCollection应该只存储“需要”的项目,我还使用绑定到TVData的ItemSource进行了TreeView

函数FillAliasTreeView仅用于用数据填充_TreeView数据库,因此我不会在此处粘贴代码

在程序开始时,I\u TreeViewBase分配给加载边栏()中的_TVData函数,一切正常。 两个ObservableCollection都在存储所有数据

但当我搜索某个东西时(我的TVData在搜索框中被修改_TextChanged()),似乎 此外,还修改了树视图库

这怎么可能?我在代码中犯了一些重大错误吗

我的班级(几乎全部代码):

公共部分类侧栏:页面,INotifyPropertyChanged
{
私有可观察收集树视图数据库;
私有可观测收集数据;
公共侧边栏()
{
TreeViewBase=新的ObservableCollection(ConnectionUtilities.LoadObservableConnections());
TVData=新的ObservableCollection();
初始化组件();
DataContext=this;
var loadSideBar=Task.Factory.StartNew(异步()=>{await loadSideBar();});
loadSideBar.Wait();
OnPropertyChanged(“TVData”);
}
公共异步任务LoadSideBar()
{
//此函数用于填充my_TreeView数据库
等待FillAliasTreeView();
TVData=树视图数据库;
OnPropertyChanged(“TVData”);
}
私有异步无效搜索框\u TextChanged(对象发送者,textchangedventargs e)
{
字符串newsearchText=SearchBox.Text;
如果((newsearchText==“”| | newsearchText==“搜索…”| | newsearchText.Length<3))
{
TVData.Clear();
TVData=null;
MessageBox.Show((TVData==null.ToString()+“”+TreeViewBase.Count.ToString());
TVData=新的可观察集合(TreeView数据库);
AliasTree.ItemsSource=TVData;
AliasTree.UpdateLayout();
返回;
}
searchText=SearchBox.Text;
if(TVData!=null)
{
wait Dispatcher.InvokeAsync(
() =>
{
foreach(TVData.ToList()中的ConnectionModel cm)
{
foreach(cm.schemas.ToList()中的SchemaModel sm)
{
foreach(sm.schema_collections.ToList()中的SchemaCollection sc)
{
尝试
{
ObservableCollection octm=(ObservableCollection)sc.collection;
对于(int i=0;iOnPropertyChanged(“tables”);
}
Dispatcher.InvokeAsync(()=>OnPropertyChanged(“collection”);
}
捕获(异常exc){}
}
InvokeAsync(()=>OnPropertyChanged(“模式”);
}
Dispatcher.InvokeAsync(()=>OnPropertyChanged(“TVData”);
}
Dispatcher.InvokeAsync(()=>OnPropertyChanged(“TVData”);
});
wait Dispatcher.InvokeAsync(()=>ExpandAll(别名树));
}
}
专用void ExpandAll(ItemsControl根目录)
{
if(root!=null)
{
foreach(root.Items中的var子项)
{
if(子项!=null)
{
ExpandAll((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(子项));
尝试
{
if(((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(子项)作为TreeViewItem)!=null)
((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(子项)作为TreeViewItem.IsExpanded=true;
}
捕获(例外exc){};
}
}
AliasTree.UpdateLayout();
}
}

谢谢您的建议。

在构造函数中,您将
TVData
TreeViewBase
设置为
observeCollection
的两个不同实例。但下面这一行:

TVData = TreeViewBase;
使它们引用同一实例。旧的
TVData
可观察集合被丢弃,这两个变量现在都引用同一个可观察集合


这只是。

在构造函数中,您将
TVData
TreeViewBase
设置为
observeCollection
的两个不同实例

TVData = TreeViewBase;
使它们引用同一实例。旧的
TVData
可观察集合被丢弃,这两个变量现在都引用同一个可观察集合


这只是。

您将一个设置为与另一个相等:TVData=TreeViewBase;这使它们成为相同的可观察集合。您将一个设置为与另一个相等:TVData=TreeViewBase;这使它们成为相同的可观察集合。谢谢。有什么干净的解决方案吗