Почему мои TextBox на разных вкладках TabControl теряют свою историю отмен?
У меня есть TabControl
с TextBox
элементы управления в ContentTemplate
, Когда я набираю некоторый текст на одной вкладке и переключаюсь на другую вкладку, история отмен на исходной вкладке исчезает, когда я возвращаюсь.
Другая проблема, которая возникает, - любой выбранный текст отменяется, и каретка перемещается в начало TextBox
,
Если я сделаю окно только с жестко закодированным TabItem
управления, история отмены сохраняется. Проблема связана с моей привязкой или шаблонами.
Вот мой XAML для главного окна
<Window x:Class="TabbedTextAreaTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Command="{Binding AddNewTab}">Add Tab</Button>
<TabControl ItemsSource="{Binding Tabs}" Grid.Row="1">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</Window>
Есть ли способ сохранить историю отмен / повторов и выделенный текст при переключении вкладок, не перехватывая вручную эти команды?
2 ответа
Когда вы используете TabControl
который получает свои вкладки через привязку данных на ItemsSource
WPF не сохраняет визуальное дерево для каждого элемента при переключении. Таким образом, при переключении с вкладки 1 на вкладку 2, а затем обратно на вкладку 1 элементы управления на вкладке 1 на самом деле не совпадают с экземплярами элементов управления, которые вы видели на вкладке 1 в первый раз.
Есть несколько способов справиться с этим - TabControl
с явным TabItem
экземпляры сохраняют свои визуальные деревья при переключении вкладок, поэтому, вероятно, самый простой способ сделать это - обернуть вашу коллекцию элементов вкладки в нечто, что делает TabItem
для них.
К сожалению, сейчас я не могу найти ссылку на пример того, как это сделать. Есть ссылки на статьи в других местах на SO, но все они, кажется, указывают на страницы, которые больше не существуют, и у меня нет времени копать глубже.
Причина проста. Если вы считаете, что обе операции, на которые вы жалуетесь, являются исключительно операциями пользовательского интерфейса: Отмена: редактирование пользователем элемента управления пользовательского интерфейса, выбор: выделение текста на элементе управления пользовательского интерфейса.
Когда вы глотаете Tab
к другому и вернемся, то, что происходит в WPF, это то, что все элементы управления привязаны к этим данным (ModelView
нормально или просто Model
) снова, как будто вы показывали их в первый раз. Таким образом, они теряют свои атрибуты внешнего вида.
Чтобы правильно управлять этим в Tab
среда в WPF
вам нужно управлять Undo/Redo
стек самостоятельно.
Удачи.