这其实是一个相当大的话题。然而,为了简单起见,暂时排除设计模式和 MVVM 框架......
你需要创建;
WPF XAML 视图具有:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="728" Width="772">
<Grid>
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataGridDataSource}" HorizontalAlignment="Center" Margin="0,88,0,0" VerticalAlignment="Top" Height="286" Width="584"/>
<Grid Margin="0,403,0,0" VerticalAlignment="Top" HorizontalAlignment="Center" >
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Content="Start Date:" HorizontalAlignment="Left" Margin="10,8,0,0" VerticalAlignment="Top"/>
<DatePicker SelectedDate="{Binding StartDate}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Grid.Column="1"/>
<Label Content="End Date:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Grid.Column="2"/>
<DatePicker SelectedDate="{Binding EndDate}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Grid.Column="3"/>
</Grid>
</Grid>
</Window>
一个名为 clsATemperatureViewModel 的 ViewModel 类:
Imports System.Collections.ObjectModel
Imports System.ComponentModel
''' <summary>
''' Only for Simulating the EF Context!
''' </summary>
''' <remarks></remarks>
Public Class TableTemperatures
Public Property LogTime As Date
Public Property Temperature As Double
End Class
Public Class clsMyTemperatureViewModel : Implements INotifyPropertyChanged
Private _ListOfTemperatures As ObservableCollection(Of TableTemperatures)
Private _MyDataGridDataSource As ObservableCollection(Of TableTemperatures)
Public Property MyDataGridDataSource As ObservableCollection(Of TableTemperatures)
Get
Return _MyDataGridDataSource
End Get
Set(value As ObservableCollection(Of TableTemperatures))
_MyDataGridDataSource = value
OnPropertyChanged("MyDataGridDataSource")
End Set
End Property
Private _StartDate As Date
Public Property StartDate As Date
Get
Return _StartDate
End Get
Set(value As Date)
If _StartDate <> value Then
_StartDate = value
OnPropertyChanged("StartDate")
GetResults()
End If
End Set
End Property
Private _EndDate As Date
Public Property EndDate As Date
Get
Return _EndDate
End Get
Set(value As Date)
If _EndDate <> value Then
_EndDate = value
OnPropertyChanged("EndDate")
GetResults()
End If
End Set
End Property
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChanged(ByVal PropertyChangeName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(PropertyChangeName))
End Sub
Public Sub GetResults()
Dim query = From TemperatureList In _ListOfTemperatures
Where TemperatureList.LogTime >= StartDate
Where TemperatureList.LogTime <= EndDate
Select TemperatureList
MyDataGridDataSource = New ObservableCollection(Of TableTemperatures)(query)
End Sub
Public Sub New()
'
' Only for Simulating the EF Context!
'
_ListOfTemperatures = New ObservableCollection(Of TableTemperatures)
_ListOfTemperatures.Add(New TableTemperatures With {.LogTime = New Date(2012, 9, 1), .Temperature = 14})
_ListOfTemperatures.Add(New TableTemperatures With {.LogTime = New Date(2012, 10, 2), .Temperature = 15})
_ListOfTemperatures.Add(New TableTemperatures With {.LogTime = New Date(2012, 11, 3), .Temperature = 16})
_ListOfTemperatures.Add(New TableTemperatures With {.LogTime = New Date(2012, 12, 4), .Temperature = 17})
_ListOfTemperatures.Add(New TableTemperatures With {.LogTime = New Date(2013, 1, 5), .Temperature = 18})
StartDate = New Date(2011, 1, 1)
EndDate = New Date(2014, 1, 1)
GetResults()
End Sub
End Class
在这里,我模拟了一个小类来复制您的 EF 上下文。但是,您需要引用您的 EF Context 而不是我的 _ListOfTemperatures 集合。这会是这样的;
Public Sub GetResults()
Dim query = From TemperatureList In MyEFContext.TemperatureList
Where TemperatureList.LogTime >= StartDate
Where TemperatureList.LogTime <= EndDate
Select TemperatureList
MyDataGridDataSource = New ObservableCollection(Of TableTemperatures)(query)
End Sub
ViewModel 基本上将相关的公共属性公开给视图。需要注意的一件重要事情是,您必须实现 INotifyPropertyChanged 接口,并在 ViewModel 中的属性发生更改时引发 PropertyChanged 事件以便视图更新。
然后,您需要将以下内容添加到 New Sub 后面的代码中;
Me.DataContext = New clsMyTemperatureViewModel
这会将视图的 DataContext 设置为新的 ViewModel。
正如我之前提到的,这个示例并不尝试涉及任何 MVVM 框架,也不使用任何正确的设计模式。
您确实应该对数据使用存储库模式。您可以在此存储库中放置 Linq to Entities 代码,仅将 ObservableCollection 返回到 ViewModel。
您将创建一个解决方案:
- 一个容纳您的 EF 上下文的项目
- 数据库存储库项目
- 主应用程序的项目,该项目将为您的视图、视图模型、类、行为等设置文件夹。
不过,我希望这能让你继续前进!