Я сделал пример, чтобы проиллюстрировать «правильный путь WPF» для реализации этого сценария. Опять же, он может не соответствовать коду, который у вас уже есть, но он должен дать вам некоторые идеи о том, как адаптировать ваш код. Во-первых, код позади:
public partial class TabItemBinding : Window
{
public ObservableCollection<TextItem> Items { get; set; }
public TabItemBinding()
{
Items = new ObservableCollection<TextItem>();
Items.Add(new TextItem() { Header = "1", Content = new TextBox() { Text = "First item" } });
Items.Add(new TextItem() { Header = "2", Content = new TextBox() { Text = "Second item" } });
Items.Add(new TextItem() { Header = "3", Content = new TextBox() { Text = "Third item" } });
InitializeComponent();
}
}
public class TextItem
{
public string Header { get; set; }
public FrameworkElement Content { get; set; }
}
Здесь нет ничего сумасшедшего, я просто создаю класс модели и собираю коллекцию этого класса. Истинное совершенство происходит в XAML:
<Window x:Class="TestWpfApplication.TabItemBinding"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TabItemBinding" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ToolBar Grid.Row="0">
<Button Command="Undo">Undo</Button>
</ToolBar>
<TabControl Grid.Row="1" ItemsSource="{Binding Items}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Content" Value="{Binding Content}"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</Grid>
Я подключаю Button
к ApplicationCommands.Undo
, который автоматически позаботится об отмене для нас, пока у нас будет активное редактирование TextBox
. Сам TabControl
привязан к коллекции, которую мы создали в коде, который предоставит заголовок и некоторый текст для редактирования. И любые изменения, которые мы сделаем, будут отменены. Результат:
Снимок экрана http://img706.imageshack.us/img706/2866/tabitembinding.png
Кстати, важно отметить, что команда отмены автоматически отключится, если нет активного контекста редактирования. Поэтому, если нет вкладок, они будут отключены без дополнительного кода с нашей стороны.