WPF TabControl SelectionChanged 重復執行的問題


很邪門的問題,我曾經都感覺是微軟的bug了。

問題是這樣的:在我的tabcontrol下的tabitem中有一個combobox控件,由於一些原因,需要執行tabcontrol的SelectionChanged 事件,但是比較奇怪的時候,每當我在combobox選擇一項時,即combobox的SelectionChanged 事件改變的時候,tabcontrol的SelectionChanged 事件同時也執行了,百思不得其解,后來在網上找到了相關的原因,如下:

This is because of RoutedEvents.To solve it either handle the SelectionChanged of the combobox.
In the function handler of the SelectionChanged for combobox just give e.Handled=true;

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
        { 
            e.Handled = true; 
        } 

if u dont want to do this get the OriginalSource property of SelectionChangedEventArgs  in the tabcontrol SelectionChanged handler.This will show whether it is from tabControl or combobox.

大概就是說微軟默認事件是可以傳遞的,如果不想如此傳遞,就設置e.Handled=true終止傳遞。

嗯,最后的解決方案就只能在combobox的SelectionChanged事件中設置e.Handled=true了,另外,不止是combobox,同時也包括 listbox,listview,datagrid等存在SelectionChanged 事件的控件。

:注意 ,以上這個是一種解決方案,但是要注意,因為mvvm中事件也是通過傳遞的方式獲取的,這種方式如果是在mvvm中就會出現問題

像如下這種情況:

 <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <command:EventToCommand Command="{Binding SelectTestCommand}"   />
                </i:EventTrigger>
            </i:Interaction.Triggers>
View Code

這種情況下如果你設置e.Handled=true就會使得mvvm中本身的事件也執行不了的,那么在mvvm中這種應該怎么處理呢,那么就只能在tabcontrol的SelectionChanged事件中來設置,具體如下:

 <TabControl SelectionChanged="TabControl_OnSelectionChanged">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <command:EventToCommand Command="{Binding TabSelectTestCommand}"   />
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <TabItem Header="dd"></TabItem>
 </TabControl>

 private void TabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.Source.GetType() != typeof (TabControl))
            {
                e.Handled = true;
            }
        }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM