2012-06-19 5 views
0

У меня возникла очень странная проблема: в WPF у меня есть tabControl, который содержит 3 tabItems. Я сделал привязку из SelectedCode элемента tabControl к свойству внутри моего класса viewModel в режиме OneWayToSource.TabItem заблокирован навсегда

Вот код XAML:

<TabControl Name="mainTabControl" SelectedIndex="{Binding SelectedTabIndex, Mode=OneWayToSource}" > 
     <TabItem Header="Tab 01" Name="tab01"> ... </TabItem> 
     <TabItem Header="Tab 02" Name="tab02"> ... </TabItem> 
     <TabItem Header="Tab 03" Name="tab03"> ... </TabItem> 
</TabControl> 

И в моем ViewModel:

private int m_selectedTabIndex; 
    public int SelectedTabIndex 
    { 
     get 
     { return m_selectedTabIndex; } 
     set 
     { 
      SetAndNotify(ref m_selectedTabIndex, value,() => SelectedTabIndex); 
      SelectedTabChanged(); 
     } 
    } 

private void SelectedTabChanged() 
    { 
     // Some code 
    } 

Как вы можете видеть, каждый SelectedTabIndex изменения свойств моего ViewModel, метод SelectedTabChanged() исполняется, это работает отлично.

Моя странная проблема заключается в том, что: Когда я показываю сообщение, используя, например System.Windows.MessageBox.Show("Some Text") внутри моего SelectedTabChanged() метода, я выбираю другой TabItem и предыдущая выбранная вкладка блокируются, это выглядит, как выбрано, но он по-прежнему выбран постоянно, я не могу больше смотрите его содержимое.

Просто уточнить: Как я уже говорил, это странно проблема возникает только тогда, когда модальное окно показал

Почему происходит? Как я могу решить эту проблему?

Надеюсь, я четко объяснил себя.

Благодарим вас заблаговременно.

ответ

2

Я решил свою проблему. Поскольку я новичок в WPF, я действительно не понимаю, почему модальное окно блокирует закладки. Но я искал и обнаружил, что класс Dispatcher позволяет выполнять асинхронно метод, который предотвращает блокировку любого элемента управления.

Я изменил свой ViewModel код, как показано ниже:

public int SelectedTabIndex 
    { 
     get 
     { return m_selectedTabIndex; } 
     set 
     { 
      SetAndNotify(ref m_selectedTabIndex, value,() => SelectedTabIndex); 
      Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SelectedTabChanged), null); 
     } 
    } 

линия, которая действительно помогла мне были следующая:

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SelectedTabChanged), null); 

Надеется, что это помогает кто-то может испытывать некоторые аналогичные проблемы.

0

Я не уверен на 100%. Я понимаю вашу проблему, но MessageBox.Show порождает вложенный насос сообщений и блокирует основной Dispatcher, таким образом «замораживая» главное окно (поэтому оно модально). Если вам нужно показать оповещение в стиле MessageBox, но это не значит, что оно модно, тогда совет - создать панель с вашим сообщением в ней, которая существует в TabItem со скрытой видимостью, а затем сделать ее видимой, когда потребуется, чтобы показать вам сообщение. В этом сценарии все еще должны работать ваши закладки.

+0

Спасибо за ваш ответ, но на самом деле мне нужно показать модальное окно, так как это может быть сообщение об исключении, поэтому я пытаюсь показать любое модальное окно, не блокируя вкладку – Dante

+0

. Если это модальное, он заблокирует tabcontrol, поэтому нет возможного решения IMO –