Почему мои 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 который получает свои вкладки через привязку данных на ItemsSourceWPF не сохраняет визуальное дерево для каждого элемента при переключении. Таким образом, при переключении с вкладки 1 на вкладку 2, а затем обратно на вкладку 1 элементы управления на вкладке 1 на самом деле не совпадают с экземплярами элементов управления, которые вы видели на вкладке 1 в первый раз.

Есть несколько способов справиться с этим - TabControlс явным TabItem экземпляры сохраняют свои визуальные деревья при переключении вкладок, поэтому, вероятно, самый простой способ сделать это - обернуть вашу коллекцию элементов вкладки в нечто, что делает TabItemдля них.

К сожалению, сейчас я не могу найти ссылку на пример того, как это сделать. Есть ссылки на статьи в других местах на SO, но все они, кажется, указывают на страницы, которые больше не существуют, и у меня нет времени копать глубже.

Причина проста. Если вы считаете, что обе операции, на которые вы жалуетесь, являются исключительно операциями пользовательского интерфейса: Отмена: редактирование пользователем элемента управления пользовательского интерфейса, выбор: выделение текста на элементе управления пользовательского интерфейса.

Когда вы глотаете Tab к другому и вернемся, то, что происходит в WPF, это то, что все элементы управления привязаны к этим данным (ModelView нормально или просто Model) снова, как будто вы показывали их в первый раз. Таким образом, они теряют свои атрибуты внешнего вида.

Чтобы правильно управлять этим в Tab среда в WPF вам нужно управлять Undo/Redo стек самостоятельно.

Удачи.

Другие вопросы по тегам