在C#WPF中,为什么我的TabControl的SelectionChanged事件经常发射?
我有一个选项卡式GUI,每个选项卡包含一个框架。 在其中一个框架中有一个DataGrid。 当用户select这个选项卡,我需要我的数据网格sorting,所以我使用TabControl SelectionChanged事件触发sorting。 但是,每次从DataGrid中select一个项目时都会触发此事件,即使这些标签本身保持不变。
我已经尝试了多个不同的事件:GotFocus为TabItem的一个TabItem的RequestBringIntoView
但他们似乎都受到这个问题的困扰。 这是什么原因造成的?
TabControl.SelectionChanged
与ComboBox.SelectionChanged
是相同的事件
它来自Selector.SelectionChanged
。
所以,如果你不把你的事件标记为在你的事件处理程序中处理,它会冒泡树,并最终到达你的TabControl
,这导致这个“频繁发射”的问题。
将您的事件标记为在您的DataGrid中使用的ComboBox
/ ListBox
/ ListView
/任何其他select器的SelectionChanged中,如下所示:
private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { e.Handled = true; }
而这种不便将会消失;)。
私人无效tabControlName_SelectionChanged(对象发件人,SelectionChangedEventArgs e) { 如果(e.Source是TabControl)//如果从TabControl触发此事件,则input { 如果(tabItemName.IsSelected) { //在这里做你的工作 } } }
如果在父元素中添加了具有AddHandler的处理程序,则所有select更改都将触发SelectionChanged事件。 在这种情况下,您可以给TabControl一个名称,然后检查EventHandler,如果该OriginalSource的名称是您的TabControl的名称。
另一个很好的方法是向tabControl.Items.SelectionChanged添加一个处理程序:
private void Window_Loaded(object sender, RoutedEventArgs e) { ItemCollection view = tabControl.Items; view.CurrentChanged += new EventHandler(view_CurrentChanged); } void view_CurrentChanged(object sender, EventArgs e) { throw new NotImplementedException(); }
也许不是一种折衷的方式,但是不那么痛苦,因为只有当一件物品被改变时才会发生。