Данные вкладки, потерянные на выбранном элементе, изменены MVVM - PullRequest
0 голосов
/ 23 марта 2012

Я пытался сделать это целую вечность и не испытывал никакой радости.

У меня есть окно ленты следующей иерархии:

  • MainWindow
    • MainContent (элемент управления Tab)
      • TabContainerViewModel
        • ViewModelBase

Просмотр базы модели имеетObservableCollection вкладок типа ViewModelBase.Сам элемент Tab Control хорошо привязан к ним, отображая соответствующие модели представлений.У меня есть 2 проблемы, однако, я хочу, чтобы «NotepadView» (типа viewmodelbase) копировался много раз (один вид - много моделей представлений).

В данный момент у меня есть 4 представления (NotePadViewModelx, где x равно 1-4) с соответствующими моделями представления, это потому, что у каждого представления был одинаковый текст на вкладке.Теперь у меня есть отдельные представления для каждой вкладки.

Когда я набираю на вкладке 1 и переключаюсь на вкладку 2, я теряю то, что набрал на вкладке 1, когда нажимаю назад.

Может ли кто-нибудь помочь предоставитьмне с решением этих проблем?

  • Один NotepadView для нескольких экземпляров ViewModel
  • Хранение информации при изменении вкладок

Большое спасибо заранее.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Я переместил свойства Header и Text в ViewModelBase, а затем, когда я добавил ViewModelBase в качестве вкладки, я использовал DataTemplate для ViewModelBase, как и для NotePadViewModels только с текстовым полем.

  <DataTemplate DataType="{x:Type ui:ViewModelBase}">
    <TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
  </DataTemplate>

Asиспользовать это:

  <DataTemplate DataType="{x:Type ui:NotepadViewModel}">
      <ui:NotePadView DataContext="{Binding}"/>
  </DataTemplate>
  <DataTemplate DataType="{x:Type ui:NotepadViewModel2}">
      <ui:NotePadView2 DataContext="{Binding}"/>
  </DataTemplate>
  <DataTemplate DataType="{x:Type ui:NotepadViewModel3}">
      <ui:NotePadView3 DataContext="{Binding}"/>
  </DataTemplate>

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

0 голосов
/ 23 марта 2012

По умолчанию WPF будет повторно использовать TabItem, когда это возможно, и просто заменит DataContext позади него. Если ваши свойства не привязаны ни к чему в DataContext, они будут сброшены при переключении вкладок.

Таким образом, чтобы сохранить ваши изменения, вам нужно сохранить их в DataContext

Например,

<TabControl ItemsSource="{Binding MyNotepadVMCollection}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding SomePropertyOnViewModel}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...