RichTextBox теряет контент при переключении моделей представления - PullRequest
0 голосов
/ 26 мая 2019

Я настроил вкладку типа окна wpf для переключения между моделями просмотра. Главное окно выглядит следующим образом.

    <Window.Resources>
    <DataTemplate DataType="{x:Type skyTelescope:SkyTelescopeVM}">
        <skyTelescope:SkyTelescopeV />
    </DataTemplate>
    <DataTemplate DataType="{x:Type charting:ChartingVM}">
        <charting:ChartingV />
    </DataTemplate>
    <DataTemplate DataType="{x:Type focuser:FocuserVM}">
          <focuser:FocuserView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type notes:NotesVM}">
        <notes:NotesV />
    </DataTemplate>
    <DataTemplate DataType="{x:Type settings:SettingsVM}">
        <settings:SettingsV />
    </DataTemplate>
</Window.Resources>
<Grid Height="510" Width="800">
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="440"/>
    </Grid.RowDefinitions>
    <mcontrol:WindowTitleBar Grid.Row="0" />
    <mcontrol:TabBar Grid.Row="1" />
    <Grid Grid.Row="2">
        <ContentControl Content="{Binding CurrentPageViewModel}" />
    </Grid>
</Grid>

Представление NotesV является UserControl и имеет RichTextBox. Я использовал код, чтобы установить все необходимые кнопки редактирования. Моя проблема в том, что я теряю весь контент RTB, когда я переключаюсь на другую модель представления и затем возвращаюсь. Я не совсем уверен, почему это происходит ... кажется, что теряет состояние или контекст. любая помощь приветствуется.

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

Событие SelectionChanged для его сохранения ....

   using (var ms = new MemoryStream())
        {
            var range2 = new TextRange(rtbEditor.Document.ContentStart, rtbEditor.Document.ContentEnd);
            range2.Save(ms, DataFormats.Rtf);
            ms.Seek(0, SeekOrigin.Begin);
            using (var sr = new StreamReader(ms))
            {
                SkyServer.Notes = sr.ReadToEnd();
            }
        }

Код конструктора ....

   if (!string.IsNullOrEmpty(SkyServer.Notes))
        {
            Stream SM = new MemoryStream(Encoding.UTF8.GetBytes(SkyServer.Notes));
            var range = new TextRange(rtbEditor?.Document.ContentStart, rtbEditor?.Document.ContentEnd);
            range.Load(SM, DataFormats.Rtf);
            SM.Close();
        }
...