获取 SelectionChanged 事件上一个选项卡的内容
Get content of a previous tab on SelectionChanged event
我试图在 TabControl 中更改为另一个时获取先前选择的选项卡内容。为此,我像这样订阅了 SelectionChanged 事件:
tabControl.SelectionChanged += getPreviousData
然后 getPreviousData
方法如下所示:
private void getPreviousData(object sender, SelectionChangedEventArgs e)
{
e.RemovedItems[0].something
}
我有点不确定我是如何抓取上一个标签内容的。上一个选项卡有一个文本框控件,当我更改选项卡时,我需要获取它的名称。我怎样才能做到这一点?
假设你有一个 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。
- 创建视图模型
- 实现 INotifyPropertyChanged 接口
- 创建一个 属性 来保存您的文本值,并在集合中调用 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 构造函数中,将 DataContext 属性 从 Window 设置为 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;
}
}
如果它在您之后的现有选项卡之间切换,那么我建议只需将所选选项卡的索引存储在 class 变量中。
示例代码如下所示:
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 中通过 double-clicking 做到了这一点,但您也可以通过添加手动挂钩:
this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
到表单构造函数,在示例代码中称为 "Form1()"。
获取文本框的 name 是一件不寻常的事情。请问你想达到什么目的?可能有比尝试确定控件名称更好的方法。
我试图在 TabControl 中更改为另一个时获取先前选择的选项卡内容。为此,我像这样订阅了 SelectionChanged 事件:
tabControl.SelectionChanged += getPreviousData
然后 getPreviousData
方法如下所示:
private void getPreviousData(object sender, SelectionChangedEventArgs e)
{
e.RemovedItems[0].something
}
我有点不确定我是如何抓取上一个标签内容的。上一个选项卡有一个文本框控件,当我更改选项卡时,我需要获取它的名称。我怎样才能做到这一点?
假设你有一个 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。
- 创建视图模型
- 实现 INotifyPropertyChanged 接口
- 创建一个 属性 来保存您的文本值,并在集合中调用 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 构造函数中,将 DataContext 属性 从 Window 设置为 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;
}
}
如果它在您之后的现有选项卡之间切换,那么我建议只需将所选选项卡的索引存储在 class 变量中。
示例代码如下所示:
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 中通过 double-clicking 做到了这一点,但您也可以通过添加手动挂钩:
this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
到表单构造函数,在示例代码中称为 "Form1()"。
获取文本框的 name 是一件不寻常的事情。请问你想达到什么目的?可能有比尝试确定控件名称更好的方法。