0

非常に奇妙な問題が発生しています。WPF には、3 つの tabItems を含む tabControl があります。「OneWayToSource」モードで、tabControl の SelectedIndex からビューモデル クラス内のプロパティへのバインディングを作成しました。

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プロパティが変更されるたびにSelectedTabChanged()メソッドが実行され、これは完全に機能します。

私の奇妙な問題は、たとえばメソッドSystem.Windows.MessageBox.Show("Some Text")内でメッセージを表示するSelectedTabChanged()と、別の tabItem を選択すると、以前に選択したタブがブロックされ、選択されているように見えますが、永続的に選択されたままになり、そのコンテンツが表示されなくなります。

明確にするために:前に述べたように、この奇妙な問題はモーダルウィンドウが表示されている場合にのみ発生します

なぜ起こっているのですか?この問題を解決するにはどうすればよいですか?

私は自分自身を明確に説明したことを願っています。

前もって感謝します。

4

2 に答える 2

2

私は自分の問題を解決しました。私はWPFが初めてなので、モーダルウィンドウでタブがブロックされる理由が本当にわかりません。しかし、私が検索していたところ、Dispatcher クラスを使用すると、コントロールがブロックされるのを防ぐメソッドを非同期的に実行できることがわかりました。

ビューモデルのコードを次のように変更しました。

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

これが、他の誰かが同様の問題を経験している可能性があることを願っています。

于 2012-06-19T17:22:22.157 に答える
0

あなたの問題を100%理解しているとは限りませんがMessageBox.Show、ネストされたメッセージポンプを生成して main をブロックしDispatcher、メインウィンドウを「フリーズ」します(これがモーダルである理由です)。MessageBoxモーダルにせずにスタイルアラートを表示する必要がある場合、私のアドバイスはTabItem、非表示の可視性で存在するメッセージを含むパネルを作成し、メッセージを表示する必要があるときに表示することです。タブの選択は、そのシナリオでも機能するはずです

于 2012-06-19T15:44:35.683 に答える