选定项目上丢失的选项卡数据更改了MVVM

时间:2012-03-23 15:23:58

标签: c# .net wpf vb.net mvvm

我一直试图这样做多年并且没有任何快乐。

我有一个以下层次结构的功能区窗口:

  • 主窗口
    • 主要内容(标签控件)
      • TabContainerViewModel
        • ViewModelBase

View model base有一个ObservableCollection选项卡类型ViewModelBase。选项卡控件本身与这些绑定很好,显示适当的视图模型。我有2个问题但是,我想要一个“NotepadView”(类型为viewmodelbase)被多次复制(一个视图很多视图模型)。

此时,我有4个视图(NotePadViewModelx,其中x是1-4)和相应的视图模型,这是因为每个视图的每个选项卡都有相同的文本。现在我每个标签都有单独的视图。

当我输入标签1并切换到标签2时,当我点击后退时,我丢失了在标签1中输入的内容。

有人可以帮我解决这些问题吗?

  • 用于ViewModel的多个实例的一个NotepadView
  • 在标签更改时保留信息

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

我将Header和Text属性移动到ViewModelBase中,然后当我添加一个ViewModelBase作为Tab时,我使用了一个DataTemplate作为ViewModelBase,就像NotePadViewModel只使用了一个文本框一样。

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

作为使用者:

  <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>

感谢Rachel对这个问题的一点小提示。基本上以前的方式,在datatemplate中没有任何实际绑定,因此它没有理由将其保留为资源。通过在datatemplate中添加默认文本框,我可以添加尽可能多的记事本,同时可以添加其他不需要文本框的视图。

答案 1 :(得分:0)

默认情况下,WPF会尽可能重复使用TabItem,只需替换它后面的DataContext即可。如果您的属性未绑定到DataContext中的任何内容,则切换标签时它们将重置。

因此,要使更改保持不变,您需要将其存储在DataContext

例如,

<TabControl ItemsSource="{Binding MyNotepadVMCollection}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding SomePropertyOnViewModel}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>