C# 为什么我的第二个ObservaleCollection正在获得更新?
我有两个可观察集合,其中填充了相同类型的项(这些项也是填充了其他类型对象的可观察集合) \u TreeView数据库-第一个可观察到的收集是所有数据的“基础” \u TVData-第二个ObservableCollection应该只存储“需要”的项目,我还使用绑定到TVData的ItemSource进行了TreeView 函数FillAliasTreeView仅用于用数据填充_TreeView数据库,因此我不会在此处粘贴代码 在程序开始时,I将\u TreeViewBase分配给加载边栏()中的_TVData函数,一切正常。 两个ObservableCollection都在存储所有数据 但当我搜索某个东西时(我的TVData在搜索框中被修改_TextChanged()),似乎 此外,还修改了树视图库 这怎么可能?我在代码中犯了一些重大错误吗 我的班级(几乎全部代码):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分配给加载边栏()中的
公共部分类侧栏:页面,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;这使它们成为相同的可观察集合。谢谢。有什么干净的解决方案吗