假设您有这样的 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 构造函数中,将 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;
}
}