これは実際にはかなり大きなテーマです。ただし、物事を単純に保つために、今のところデザインパターンと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>
clsMyTemperatureViewModelのようなものと呼ばれるVieModelクラス:
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コンテキストを複製するための小さなクラスをモックアップしました。ただし、私の_ListOfTemperaturesコレクションではなく、EFコンテキストを参照する必要があります。これは次のようになります。
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は基本的に、関連するパブリックプロパティをビューに公開します。注意すべき重要な点の1つは、INotifyPropertyChangedインターフェイスを実装し、ViewModel内でプロパティが変更されたときにビューを更新するためにPropertyChangedイベントを発生させる必要があることです。
次に、NewSubの背後にあるコードに以下を追加する必要があります。
Me.DataContext = New clsMyTemperatureViewModel
これにより、ビューのDataContextが新しいViewModelに設定されます。
前に述べたように、この例ではMVVMフレームワークを使用したり、適切なデザインパターンを使用したりすることはありません。
実際には、データにリポジトリパターンを使用する必要があります。このリポジトリ内で、Linq to Entitiesコードを配置し、ObservableCollectionのみをViewModelに返します。
次のようなソリューションを作成します。
- EFコンテキストを収容するプロジェクト
- データベースリポジトリのプロジェクト
- メインアプリケーションのプロジェクト。ビュー、ビューモデル、クラス、ビヘイビアーなどのフォルダーが設定されます。
しかし、これでうまくいくことを願っています!