选择 tabitem 时事件的更好方法

Better approach for event when tabitem is selected

我有一个 tabcontrol,里面有 8 个 tabitem 和许多数据网格和列表框。 我只想在选择一个特定的 tabitem 时触发一个事件。

第一种方法是在带有 if 语句的 tabcontrol 中使用 SelectionChanged

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

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

最好的方法是什么?

(起伏是 SelectionChanged 由于数据网格而一直触发,而 mouseup 事件解决方案并不让我开心)

谢谢。

一般来说,您不必太担心触发的事件,然后因为它们不符合您的条件而跳过。框架本身做了很多,你最终也会做很多(例如在收听INotifyPropertyChanged事件时)。

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

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

您还可以绑定 IsSelected 属性
在集合中做你需要做的,当它变成真时

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