我一直试图这样做多年并且没有任何快乐。
我有一个以下层次结构的功能区窗口:
View model base有一个ObservableCollection选项卡类型ViewModelBase。选项卡控件本身与这些绑定很好,显示适当的视图模型。我有2个问题但是,我想要一个“NotepadView”(类型为viewmodelbase)被多次复制(一个视图很多视图模型)。
此时,我有4个视图(NotePadViewModelx,其中x是1-4)和相应的视图模型,这是因为每个视图的每个选项卡都有相同的文本。现在我每个标签都有单独的视图。
当我输入标签1并切换到标签2时,当我点击后退时,我丢失了在标签1中输入的内容。
有人可以帮我解决这些问题吗?
非常感谢提前。
答案 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>