【问题标题】:Get content of a previous tab on SelectionChanged event获取 SelectionChanged 事件上一个选项卡的内容
【发布时间】:2016-01-05 12:09:41
【问题描述】:

当它在 TabControl 中更改为另一个时,我试图获取以前选择的选项卡内容。为此,我订阅了 SelectionChanged 事件,如下所示:

tabControl.SelectionChanged += getPreviousData

那么getPreviousData 方法如下所示:

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

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

【问题讨论】:

    标签: c# wpf events tabcontrol


    【解决方案1】:

    假设您有这样的 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
    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 中使用绑定表达式设置 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果它在您所关注的现有选项卡之间切换,那么我建议将所选选项卡的索引简单地存储在类变量中。

      示例代码如下所示:

      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()”。

      获取文本框的名称是一件不寻常的事情。请问您要达到什么目的?可能有比尝试确定控件名称更好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多