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;
          }));
    }
}