选择tabitem时更好地处理事件

时间:2015-02-23 16:07:48

标签: c# wpf tabcontrol

我有一个带有8个tabitems的tabcontrol,里面有很多datagrids和listbox。 我只想在选择一个特定的tabitem时启动一个事件。

第一种方法是tabcontrol中的SelectionChanged,其中包含if语句

If ((thetabiwant!=null)&& (thetabiwant.IsSelected)) 
{
//code here 
}

第二种方法是在所需的tabitem中有一个mouseup事件。

最好的方法是什么?

(起伏是因为数据网格,所以SelectionChanged会一直触发,而mouseup事件解决方案并不能让我满意)

感谢。

2 个答案:

答案 0 :(得分:0)

一般情况下,您不应过于担心因为与您的条件不符而跳过的事件。框架本身就是很多,你最终也会做很多事情(比如在收听INotifyPropertyChanged事件时)。

在您的情况下,被解雇的少数额外SelectionChanged事件实际上可以忽略不计。每个事件都要求用户实际更改选项卡,这种情况不会经常发生。另一方面,一旦你在你关心的标签中,实际上发生了很多鼠标事件。并不是说你需要关心它们的数量(除非你遇到问题,否则你真的不应该这样做)但当然你可以避免它。

所以在这种情况下,是的,只是跳过SelectionChanged事件是最好的方法。

答案 1 :(得分:0)

您还可以绑定IsSelected属性
在集合中执行更改为true时需要执行的操作

TabItem.IsSelected

<TabControl Grid.Row="0">
    <TabItem Header="One" IsSelected="{Binding Path=Tab1Selected, Mode=TwoWay}"/>
    <TabItem Header="Two" IsSelected="{Binding Path=Tab2Selected, Mode=TwoWay}"/>
</TabControl>

private bool tab1Selected = true;
private bool tab2Selected = false;
public bool Tab1Selected
{
    get { return tab1Selected; }
    set
    {
        if (tab1Selected == value) return;
        tab1Selected = value;
        NotifyPropertyChanged("Tab1Selected");
    }
}
public bool Tab2Selected
{
    get { return tab2Selected; }
    set
    {
        if (tab2Selected == value) return;
        tab2Selected = value;
        if (tab2Selected)
        {
            MessageBox.Show("Tab2Selected");
            // do your stuff here
        }
        NotifyPropertyChanged("Tab2Selected");
    }
}