2016-09-21 62 views
-1

我需要从另一个线程访问TabControlSelectedIndex财产获得的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; 
     } 
} 

,但我得到

系统.InvalidOperationException

无法通过调用线程访问对象,因为该对象由其他线程属性拥有。

我想通过SelectedIndex返回一个列表,我做错了什么?

+0

你能告诉你为什么你需要通过不同的线程访问selectedindex吗?如果你访问你如何同步它们?换句话说,如果你在值改变之前从另一个线程返回selectedindex,你怎么能够捕获值? – FreeMan

+0

@FreeMan因为我需要返回一个特定的列表,每个选项卡包含一个列表,所以如果选择了选项卡2,我需要返回列表CustomMatches。 而应用程序有不同的线程调用'CurrentTab' – AgainMe

+0

您必须使用TabControl所属的Dispatcher。所以,如果你在一个不同的线程上,并且你编写了'Application.Current.Dispatcher',它不一定会给你找到你想要的调度器。每个FrameworkElement都有一个包含其调度程序线程的属性。 – Meloviz

回答

0

当你知道它会通过比其他UI另一个线程来完成,只需调用你需要什么

int currentTab = 0; 
MainWindow.AppWindow.TabControl.Dispatcher.Invoke(() => { 
    currentTab = MainWindow.AppWindow.TabControl.SelectedIndex; 
}); 
+0

我没有任何InvokeRequired – AgainMe

+0

对不起,我错过了它是WPF。原始答案已更新。 – jbmintjb

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

这可能工作。

+0

谢谢,但这将返回一个例外的属性列表:http://imgur.com/a/DPirO – AgainMe

+0

有趣的是它适合我。 – FreeMan

+0

有没有解决这个问题的建议? – AgainMe