TabItem永久被阻止

时间:2012-06-19 15:30:49

标签: c# wpf tabcontrol tabitem

我遇到了一个非常奇怪的问题:在WPF中,我有一个包含3个tabItem的tabControl。我已将tabControl的SelectedIndex绑定到“OneWayToSource”模式下viewModel类中的属性。

这是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
    }

正如您所看到的,每次我的viewModel的SelectedTabIndex属性发生更改时,都会执行SelectedTabChanged()方法,这非常有效。

我的奇怪问题是:当我在System.Windows.MessageBox.Show("Some Text")方法中使用例如SelectedTabChanged()显示消息时,我选择了另一个tabItem,之前选择的标签被阻止,它看起来像选中,但它仍然是永久选定的,我再也看不到它的内容了。

只是为了澄清:正如我之前所说,只有在显示模态窗口时才会发生这个奇怪的问题

为什么会这样?我该如何解决这个问题?

我希望我能清楚地解释清楚。

提前谢谢。

2 个答案:

答案 0 :(得分: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);

希望这有助于其他人遇到类似的问题。

答案 1 :(得分:0)

我不是100%确定我理解你的问题,但是MessageBox.Show会产生一个嵌套的消息泵并阻塞主Dispatcher,从而“冻结”主窗口(这就是为什么它是模态的)。 如果您需要显示MessageBox样式警报而不是模态警告,那么我的建议是创建一个面板,其中包含您的消息,TabItem中存在隐藏的可见性,然后在需要向您显示消息。您的选项卡选择仍然适用于该场景