我遇到了一个非常奇怪的问题:在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,之前选择的标签被阻止,它看起来像选中,但它仍然是永久选定的,我再也看不到它的内容了。
只是为了澄清:正如我之前所说,只有在显示模态窗口时才会发生这个奇怪的问题
为什么会这样?我该如何解决这个问题?
我希望我能清楚地解释清楚。
提前谢谢。
答案 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
中存在隐藏的可见性,然后在需要向您显示消息。您的选项卡选择仍然适用于该场景