【发布时间】:2010-05-05 03:14:17
【问题描述】:
我正在使用 MVVM 框架创建一个 WPF 应用程序,并且我采用了 Josh Smith 关于 MVVM here... 的文章中的几个功能
最重要的是,我将 TabControl 绑定到 ViewModel 的 ObservableCollection。这意味着正在使用一个选项卡式 MDI 界面,该界面将 UserControl 显示为 TabItem 的内容。我在应用程序中看到的问题是,当我有多个选项卡并且在选项卡之间来回切换时,每次更改选项卡时都会引用内容。
如果您下载 Josh Smith 的源代码,您会发现他的应用也存在同样的问题。例如,单击“查看所有客户”按钮并向下滚动到 ListView 的底部。接下来单击“创建新客户”按钮。当您切换回 All Customer 视图时,您会注意到 ListView 滚动回顶部。如果您切换回 New Customer 选项卡并将光标放在其中一个 TextBoxes 中,然后切换到 All Customers 选项卡并返回,您会注意到光标现在消失了。
我想这是因为我使用的是 ObservableCollection,但我不能确定。有什么办法可以防止tab的内容在收到焦点时刷新?
编辑: 当我在我的应用程序上运行分析器时,我发现了我的问题。我正在为我的 ViewModels 定义一个 DataTemplate,因此它知道如何在 ViewModel 显示在选项卡中时呈现它......就像这样:
<DataTemplate DataType="{x:Type vm:CustomerViewModel}">
<vw:CustomerView/>
</DataTemplate>
所以每当我切换到不同的选项卡时,它都必须重新创建 ViewModel。我通过将 ViewModels 的 ObservableCollection 更改为 UserControls 的 ObservableCollection 来临时修复它。但是,如果可能的话,我真的还是想使用 DataTemplates。有没有办法让 DataTemplate 工作?
【问题讨论】:
标签: .net wpf mvvm tabcontrol observablecollection