C# 试图从另一个线程访问SelectedIndex
我需要从另一个线程访问C# 试图从另一个线程访问SelectedIndex,c#,.net,wpf,C#,.net,Wpf,我需要从另一个线程访问TabControl的SelectedIndex属性,我尝试使用Dispatcher如下: public ListView CurrentTab { get { ListView listView = null; Action action = () => { int currentTab = MainWindow.AppWindow.TabControl.SelectedInde
TabControl
的SelectedIndex
属性,我尝试使用Dispatcher
如下:
public ListView CurrentTab
{
get
{
ListView listView = null;
Action action = () =>
{
int currentTab = MainWindow.AppWindow.TabControl.SelectedIndex;
//Check wich tab is opened
switch (currentTab)
{
case 0:
listView = MainWindow.AppWindow.PlayingControl.Playing;
break;
case 1:
listView = MainWindow.AppWindow.AllMatchesControl.AllMatches;
break;
case 2:
listView = MainWindow.AppWindow.CustomMatchesControl.CustomMatches;
break;
}
};
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(action));
return listView;
}
}
但我明白了
System.InvalidOperationException异常
调用线程无法访问该对象,因为该对象属于其他线程属性
我正试图通过
SelectedIndex
返回一个列表,我做错了什么?正如您所知,这将通过UI以外的另一个线程完成,只需调用您需要的
int currentTab = 0;
MainWindow.AppWindow.TabControl.Dispatcher.Invoke(() => {
currentTab = MainWindow.AppWindow.TabControl.SelectedIndex;
});
公共列表视图当前选项卡
{
得到
{
返回(ListView)this.Dispatcher.Invoke(
新函数(()=>
{
ListView ListView=null;
int currentTab=tabControl.SelectedIndex;
开关(当前选项卡)
{
案例0:
listView=新建listView();
listView=list_1;
打破
案例1:
listView=list_2;
打破
案例2:
listView=列表3;
打破
}
返回列表视图;
}));
}
}
这可能会起作用。你能告诉我为什么你需要通过不同的线程访问selectedindex吗?如果你访问,你如何同步它们?换句话说,如果你在值更改之前从另一个线程返回selectedindex,你怎么能捕获值?@FreeMan'因为我需要返回一个特定的列表,每个选项卡都包含一个列表,因此,如果在选项卡2中选择了,我需要返回CustomMatches列表。应用程序有不同的线程调用
CurrentTab
,您必须使用TabControl所属的调度程序。因此,如果您在另一个线程上,并且您编写了Application.Current.Dispatcher
,那么它不一定会提供您正在寻找的调度器。每个FrameworkElement都有一个包含其dispatcher线程的属性。我没有任何InvokerRequired抱歉,我错过了WPF。原始答案已更新。谢谢,但这将返回一个列表,但属性内部有一个例外:有趣,它对我有用。有任何修复此问题的建议吗?
public ListView CurrentTab
{
get
{
return (ListView)this.Dispatcher.Invoke(
new Func<ListView>(() =>
{
ListView listView = null;
int currentTab = tabControl.SelectedIndex;
switch (currentTab)
{
case 0:
listView = new ListView();
listView = list_1;
break;
case 1:
listView = list_2;
break;
case 2:
listView = list_3;
break;
}
return listView;
}));
}
}