【问题标题】:why does my ObservableCollection-bound control jump to 1st item?为什么我的 ObservableCollection 绑定控件跳转到第一项?
【发布时间】:2009-10-07 14:04:19
【问题描述】:

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

我有点绝望。我现在搜索了 5 个小时,但我无法弄清楚它为什么这样做或在哪里搜索。

我尽可能简化了整个内容并将其上传到:http://mad-scientists.co.uk/share/TestCandiMan.zip(大约 1.5MB)

非常感谢您的帮助!

我使用 C# Express 2008。

【问题讨论】:

  • 如果你删除你的 vin 目录和你的 subversion 目录,它会使 zip 小一点:-)
  • 我重新上传了没有 svn 和 bin 目录的文件,谢谢你的建议。现在大约 900KB

标签: c# data-binding user-controls mvvm


【解决方案1】:

这里的问题是,每次您选择另一个选项卡项时,TabControl 都会为其内容实例化一个新的 DataTemplate,因此您的视图会在所有设置为默认值的情况下重新创建。您必须实现一种机制,以便为给定的视图模型拥有唯一的视图。如果没有 MVVM,您只需向 ViewModel 添加一个 View 属性,但这在很大程度上违背了 MVVM 的目的。

按照您的 cmets 进行编辑:我的意思是每次您切换选项卡时,TabControl 都会使用来自 DataTemplate 的新可视化树来显示其内容。

举个例子:

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

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

  3. 您再次选择标签 #1。选项卡 #2 中的内容不再出现在可视树中并被丢弃。在这里,同样的机制再次启动。一个新的可视化树是从 DataTemplate 构建的,一切都是默认的。哎呀!但这很正常,因为 WPF 的 ContentPresenter 不会为曾经作为其内容的每个可能对象在内存中保留内容树。

=> 理论解决方案,建立自己的视觉。例如,在一个完全不完美的世界中,在您的 CustomViewModel 中创建一个唯一的 NewCustomerView,并通过一个属性将其公开,ley 说是 View。您将使用的新 DataTemplate 将是:

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

瞧,当从模板创建可视化树时,演示者将是一个全新的,但视图是唯一的,不会重新创建,因此插入符号将位于用户离开它的同一位置,选项卡也一样。

但是,就像我之前所说的,这与 MVVM 理念完全不符。尝试构建一个能够为给定 ViewModel 或类似的东西返回唯一 View 的静态类。

另一种解决方案是将 SelectedTabIndex 之类的内容添加到您的 ViewModel 中并绑定它们,CurrentFocusPosition 等,但这完全与我的视图相关。

【讨论】:

  • hmmm ...这意味着我不能在那种情况下同时使用相同的 DataTemplate(例如客户基本数据)来显示和创建?太糟糕了,因为这意味着一些冗余
  • 我想我误会了你,因为我只是添加了添加空标签的功能。即使这与现有的客户视图和数据模板无关,客户选项卡也会像以前一样跳回第 1 项...
  • 在您的 cmets 之后更新了我的答案。
  • 非常感谢!即使我希望有一个更简单的解决方案... =/
猜你喜欢
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多