Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 如何在后台线程中访问TreeViewItem的标记属性?_C#_Wpf_Multithreading_Treeview_Treeviewitem - Fatal编程技术网

C# 如何在后台线程中访问TreeViewItem的标记属性?

C# 如何在后台线程中访问TreeViewItem的标记属性?,c#,wpf,multithreading,treeview,treeviewitem,C#,Wpf,Multithreading,Treeview,Treeviewitem,我有一个wpf窗口中的树视图。对于树视图中的每个树视图项,我将相关对象存储在其标记属性中。我正在树视图上实现搜索功能。我在另一个线程中运行搜索,以避免阻塞UI。在搜索操作期间,我搜索存储在树状视图项的标记属性中的对象中的信息。但问题是标记属性在不同的线程中不可访问。我不想使用树状视图的dispatcher来访问tag属性,因为程序将在UI线程和后台线程之间切换,以进行每次标记访问。那么在后台运行搜索就没有意义了。我能做什么 我能做什么 除了最初在其上创建的线程(即UI/dispatcher线程)

我有一个wpf窗口中的树视图。对于树视图中的每个树视图项,我将相关对象存储在其标记属性中。我正在树视图上实现搜索功能。我在另一个线程中运行搜索,以避免阻塞UI。在搜索操作期间,我搜索存储在树状视图项的标记属性中的对象中的信息。但问题是标记属性在不同的线程中不可访问。我不想使用树状视图的dispatcher来访问tag属性,因为程序将在UI线程和后台线程之间切换,以进行每次标记访问。那么在后台运行搜索就没有意义了。我能做什么

我能做什么

除了最初在其上创建的线程(即UI/dispatcher线程)之外,您无法从任何其他线程访问
树视图项的
标记
属性

因此,您必须使用dispatcher将访问属性的代码打包回UI线程,在UI线程上运行所有代码,或者使用不同的方法,不使用
标记
属性来存储有关相关对象的信息


这些恐怕是你唯一的选择。

我想你用错了树状视图。wpf树视图(与winforms树视图相反)将与每个项目的datacontext中的视图模型一起使用。您需要自己维护视图模型的层次结构,然后可以根据需要访问和搜索它们。一个好的,虽然古老的读物是这样的:最好的方法就是不要使用
Tag
属性来存储这些信息。WPF是在考虑模型视图概念的情况下构建的,最好不要通过在视图(
Tag
)元素中存储模型数据来对抗这个概念。完全没有理由需要这样做。只需在开始任务时传递要搜索的文本。当选择在任务完成之前更改时,请取消选择并创建另一个。