获取SelectionChanged事件上的上一个选项卡的内容

时间:2016-01-05 12:09:41

标签: c# wpf events tabcontrol

我试图在TabControl中将以前选中的标签内容更改为另一个标签内容。为此我订阅了SelectionChanged事件,如下所示:

tabControl.SelectionChanged += getPreviousData

然后getPreviousData方法如下所示:

private void getPreviousData(object sender, SelectionChangedEventArgs e)
{
    e.RemovedItems[0].something
}

我不确定如何抓住之前的标签内容。当我更改选项卡时,上一个选项卡有一个文本框控件,我需要获取其名称。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:4)

假设您有类似的XAML

<TabControl x:Name="tabControl" SelectionChanged="tabControl_SelectionChanged">
    <TabItem Header="TabItem">
        <Grid Background="#FFE5E5E5">
            <TextBox Width="100" Height="23"></TextBox>
        </Grid>
    </TabItem>
    <TabItem Header="TabItem">
        <Grid Background="#FFE5E5E5">
            <TextBlock x:Name="TextBlock"></TextBlock>
        </Grid>
    </TabItem>
</TabControl>

第一个选项

然后,您可以使用此代码

访问已删除TabItem的子项
private void tabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    if (e.RemovedItems.Count != 0)
    {
        var tabItem = (TabItem)e.RemovedItems[0];
        var content = (Grid)tabItem.Content;
        var textBox = content.Children.OfType<TextBox>().First();
        var text = textBox.Text;
    }
}

第二个选项

您可以为文本框命名

<TextBox x:Name="TextBoxInFirstTab" Width="100" Height="23"></TextBox>

使用他的名字

访问它
var text2 = TextBoxInFirstTab.Text;

第三个选项

使用MVVM,检查此答案MVVM: Tutorial from start to finish?

我将提供一个简单的示例,没有任何框架,但我建议你使用任何人,比如MVVM Light ToolKit。

  1. 创建视图模型
  2. 实施INotifyPropertyChanged接口
  3. 创建一个保存文本值的属性,并在集合中调用OnPropertyChanged
  4. public class MyViewModel : INotifyPropertyChanged
    {
        private string _textInFirstTab;
    
        public string TextInFirstTab
        {
            get { return _textInFirstTab; }
            set
            {
                _textInFirstTab = value;
                OnPropertyChanged();
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    然后在Window构造函数中,将Window的DataContext属性设置为 MyViewModel 的新实例。

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MyViewModel();
    }
    

    然后在您的XAML中使用Binding表达式设置Text属性

    <TextBox x:Name="TextBox" Width="100" Height="23" Text="{Binding TextInFirstTab}"></TextBox>
    

    tabControl_SelectionChanged 事件中,您可以访问以下值:

    private void tabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (e.RemovedItems.Count != 0)
        {
            var myViewModel = (MyViewModel)DataContext;
            var text = myViewModel.TextInFirstTab;
        }
    }
    

答案 1 :(得分:0)

如果它在您之后的现有标签之间切换,那么我建议只将所选标签的索引存储在类变量中。

示例代码如下所示:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        // variable to store index of tab which was most recently selected
        private int lastSelectedTabIndex = -1;

        public Form1()
        {
            InitializeComponent();

            // initialise the last selected index
            lastSelectedTabIndex = tabControl1.SelectedIndex;
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // sanity check: if something went wrong, don't try and display non-existent tab data
            if (lastSelectedTabIndex > -1)
            {
                MessageBox.Show(string.Format("Previous tab: {0} - {1}", lastSelectedTabIndex, tabControl1.TabPages[lastSelectedTabIndex].Text));
            }

            // store this tab as the one which was most recently selected
            lastSelectedTabIndex = tabControl1.SelectedIndex;
        }
    }
}

这是在一个简单的应用程序中编写和测试的,其中添加了一个表单和一个TabControl。没有对默认属性进行任何更改。

当然,您必须挂钩事件处理程序。我是通过在IDE中双击它来实现的,但你也可以通过添加:

来手动挂钩
        this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);

到表单构造函数,在示例代码中称为“Form1()”。

获取文本框的名称是一件不寻常的事情。请问你想要实现的目标?除了尝试确定控件的名称之外,可能还有更好的方法。