2009-10-07 72 views
0

我有一个TDI,绑定到一个可观察的工作空间集合(全部基于Josh Smith的MVVM Demo)。在一个选项卡上,有一个用户控件,也绑定到一个可观察的集合。如果我切换标签,用户控件总是跳回到第一项。为什么我的ObservableCollection绑定控件跳转到第一项?

我有点绝望。我从现在5个小时开始搜索,但只是我无法弄清楚为什么会这样做或搜索。

我只要我能简化整个事情并将其上传到:http://mad-scientists.co.uk/share/TestCandiMan.zip(约1,5MB)

你的帮助是极大的赞赏!

我使用C#快递2008年

+0

如果你删除了你的vin目录和你的subversion dirs,它会使zip变得更小:-) – 2009-10-07 14:07:15

+0

对不起,bin目录。 – 2009-10-07 14:08:18

+0

我重新上传了没有svn和bin dirs的文件,thx的建议。现在它的大小约为900KB – 2009-10-07 14:12:31

回答

1

这里的问题是,TabControl的instantiaties每个选择其他选项卡项目时其内容的新的DataTemplate,所以你的观点是重建的一切设置为默认值。您必须实现一种机制以对给定视图模型拥有唯一视图。如果没有MVVM,你只需要在ViewModel中添加一个View属性,但这在很大程度上破坏了MVVM的目的。

编辑下面你的意见:我的意思是,每当你切换选项卡,TabControl将使用DataTemplate中的新可视化树显示其内容。

让我们举个例子:

  1. 您选择标签#1,它的内容是CustomerViewModel。从DataTemplate创建一个新的可视化树(来自NewCustomerView),并显示在TabControl上。插入符号在第一个文本框中,选项卡的第一个索引被选中,等等。

  2. 您选择了选项卡#2。来自选项卡#1的内容不再在视觉树中被丢弃。标签#2中的内容将遵循与1.相同的过程来构建树。

  3. 再次选择标签#1。来自选项卡#2的内容不再在视觉树中被丢弃。在这里,同样的机制再次激活。从DataTemplate构建一个新的可视化树,其中一切都处于默认状态。 Woops!但是这很正常,因为WPF的ContentPresenter不会为内容的每一个内容都保存一次内容树。

=>理论上的解决方案,建立自己的视觉。例如,在一个完全不完美的世界中,在CustomViewModel中创建一个独特的NewCustomerView,并通过一个属性公开它,ley的视图。你会使用新的DataTemplate将是:

<DataTemplate DataType="{x:Type CustomerViewModel}"> 
    <ContentPresenter Content="{Binding View}" /> 
</DataTemplate> 

瞧,当从模板创建的可视化树,主持人将是一个完全新的一个,但风景独特的,不会重新创建,因此插入符号将位于用户离开它的同一位置,这与制表符相同。但是,就像我之前说过的,这与MVVM哲学根本不一样。尝试构建一个静态类,它能够为给定的ViewModel或类似的东西返回一个唯一的视图。

另一种解决方案将添加到您的ViewModel像SelectedTabIndex的东西,并绑定它们,CurrentFocusPosition等,但这是完全与我有关的视图。

+0

......这意味着我不能在同一时间使用相同的DataTemplate(例如客户基本数据)来显示和创建该场景吗?这太糟糕了,因为它意味着一些冗余 – 2009-10-08 09:56:43

+0

我想我误解了你,因为我只是添加了功能添加一个空的选项卡。尽管这与现有的客户视图和数据模板无关,但客户选项卡像以前一样跳回到第1项... – 2009-10-08 10:40:28

+0

根据您的意见更新了我的回答。 – 2009-10-08 11:39:40

相关问题