这应该很简单,但它会让VS2008出现严重的问题。
我正在尝试使用MVVM的WPF,虽然我已经开发了约15年,拥有计算机科学学位,但对此还是一名新手。在当前客户端,我需要使用VB.Net。
我已经重命名了自己的变量并删除了代码中的一些干扰,所以如果不是100%的语法完美,请原谅我!您可能真的不需要代码来理解问题,但为了帮助您理解,我将其包含在内。
我有一个非常简单的MainView.xaml文件:
我也有一个名为DataView的用户控件,其中包含一个数据网格(DataGrid):
现在,如果我在XAML中实例化这个UserControl,它可以正常工作。当我运行代码时,网格显示出来并正常填充。
然而,该网格加载数据需要很长时间,我想在按钮点击后通过编程方式创建此用户控件,而不是在XAML中静态实例化网格。我想实例化用户控件,并将其作为StackPanel控件的子代插入其中:
当我执行这个操作时,一旦Button1_Click完成,我的应用程序就会锁定,开始消耗内存,并且CPU占用率约为50%。
我没有正确地实例化我的UserControl吗?所有的问题似乎都归结于DataEntry构造函数中的DataContext赋值。如果我注释掉它,应用程序按预期工作(当然,网格中没有任何内容)。
如果我将此代码块移动到Button1_Click中(基本上是将DataEntry的构造函数代码向上移动一级),应用程序仍然会失败:
我正在尝试使用MVVM的WPF,虽然我已经开发了约15年,拥有计算机科学学位,但对此还是一名新手。在当前客户端,我需要使用VB.Net。
我已经重命名了自己的变量并删除了代码中的一些干扰,所以如果不是100%的语法完美,请原谅我!您可能真的不需要代码来理解问题,但为了帮助您理解,我将其包含在内。
我有一个非常简单的MainView.xaml文件:
<Window x:Class="MyApp.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Main Window" Height="400" Width="800" Name="MainWindow">
<Button Name="Button1">Show Grid</Button>
<StackPanel Name="teststack" Visibility="Hidden"/>
</Window>
我也有一个名为DataView的用户控件,其中包含一个数据网格(DataGrid):
<UserControl x:Class="MyApp.Views.DataView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit" >
<Grid>
<WpfToolkit:DataGrid
ItemsSource="{Binding Path=Entries}" SelectionMode="Extended">
</WpfToolkit:DataGrid>
</Grid>
</UserControl>
DataView用户控件的构造函数通过将其绑定到视图模型来设置DataContext,如下所示:
Partial Public Class DataView
Dim dataViewModel As ViewModels.DataViewModel
Public Sub New()
InitializeComponent()
dataViewModel = New ViewModels.DataViewModel
dataViewModel.LoadDataEntries()
DataContext = dataViewModel
End Sub
End Class
DataView的视图模型如下所示(ViewModelBase中没有太多内容):
Public Class DataViewModel
Inherits ViewModelBase
Public Sub New()
End Sub
Private _entries As ObservableCollection(Of DataEntryViewModel) = New ObservableCollection(Of DataEntryViewModel)
Public ReadOnly Property Entries() As ObservableCollection(Of DataEntryViewModel)
Get
Return _entries
End Get
End Property
Public Sub LoadDataEntries()
Dim dataEntryList As List(Of DataEntry) = DataEntry.LoadDataEntries()
For Each dataentry As Models.DataEntry In dataEntryList
_entries.Add(New DataEntryViewModel(dataentry))
Next
End Sub
End Class
现在,如果我在XAML中实例化这个UserControl,它可以正常工作。当我运行代码时,网格显示出来并正常填充。
然而,该网格加载数据需要很长时间,我想在按钮点击后通过编程方式创建此用户控件,而不是在XAML中静态实例化网格。我想实例化用户控件,并将其作为StackPanel控件的子代插入其中:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim dataView As New DataView
teststack.Children.Add(dataView)
End Sub
当我执行这个操作时,一旦Button1_Click完成,我的应用程序就会锁定,开始消耗内存,并且CPU占用率约为50%。
我没有正确地实例化我的UserControl吗?所有的问题似乎都归结于DataEntry构造函数中的DataContext赋值。如果我注释掉它,应用程序按预期工作(当然,网格中没有任何内容)。
如果我将此代码块移动到Button1_Click中(基本上是将DataEntry的构造函数代码向上移动一级),应用程序仍然会失败:
dataViewModel = New ViewModels.DataViewModel
dataViewModel.LoadDataEntries()
dataView.DataContext = dataViewModel
我被难住了。有人能给我一些提示,告诉我可能哪里出了问题,或者如何调试我的应用程序陷入了无限循环吗?
非常感谢。