3

データをビューモデルに組み込むのに苦労しているので、誰かがこの単純なWPFMVVMの例を公開するのを手伝ってくれることを望んでいました。

SQLテーブルの温度があります。各レコードにはタイムスタンプがあり、次に数値があります。

LogTime--------------温度
01/01/201300:00--60
01/01/2013 00:05 --61.1
01/01/2013 00:10 --61.2

私のWPFビューには、開始日時と終了日時のピッカーがあり、グリッドビューを使用すると、ユーザーは日付範囲からレコードを選択して、グリッドに表示できます。

私のモデルはエンティティフレームワークであるため、苦労しているのはビューモデルに必要なものであり、linqクエリはユーザーが入力した開始日時と終了日時を渡すためにどこに行くのでしょうか。私はデータをグラフ化するつもりですが、データにObservable Collectionを使用するための明確な要件(scichart)があります。しかし、ビューにバインドするための監視可能なコレクションとしてデータベースデータがViewModelでどのように取得されるかを確認するために、非常に単純なデータの例を取得したかっただけです。また、GridViewにTelerik WPFコントロールを使用していますが、動作が異なる可能性があることを知っています。

お分かりのように、私は完全な初心者であり、他の場所で簡単な例(複雑な例がたくさんある)を見つけるのに苦労しているので、どんな助けでも大歓迎です。

4

2 に答える 2

2

これは実際にはかなり大きなテーマです。ただし、物事を単純に保つために、今のところデザインパターンと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コンテキストを収容するプロジェクト
  • データベースリポジトリのプロジェクト
  • メインアプリケーションのプロジェクト。ビュー、ビューモデル、クラス、ビヘイビアーなどのフォルダーが設定されます。

しかし、これでうまくいくことを願っています!

于 2013-01-02T16:51:56.207 に答える
1

ビューモデルを作成し、次のようにします。

public class YourViewModel: INotifyPropertyChanged
{

private ObservableCollection<YourModel> _yourModels;
public ObservableCollection<YourModel> YourModels
    {
    get { return _yourModels; }
    set
    {
    _yourModels= value;
    RaisePropertyChanged(() => this.YourModels);
    }
    }

private DateTime _startTime;
public DateTime StartTime
    {
    get { return _startTime; }
    set
    {
    if (value == _startTime) return;
    _startTime= value;
    RaisePropertyChanged(() => this.StartTime);
    }
    }

private DateTime _endTime;
public DateTime SendTime
    {
    get { return _endTime; }
    set
    {
    if (value == _endTime) return;
    _endTime= value;
    RaisePropertyChanged(() => this.SendTime);
    }
    }

public YourViewModel()
{
YourModels = new ObservableCollection<YourModel>();

//
// You'll need to load your data into the ObservableCollection
//

}
}

これで、ビューで、プロパティとコレクションにバインドする必要があります。このようなもの:

<DatePicker x:Name="startDate" SelectedDate="{Binding Path=StartDate}"></DatePicker>
<DatePicker x:Name="endDate" SelectedDate="{Binding Path=EndDate}"></DatePicker>

<ListView ItemsSource="{Binding Path=YourModels}">
     <ListView.View>
         <GridView>
         <GridViewColumn Header="YourProperty" DisplayMemberBinding="{Binding        Path=YourProperty}" />
         </GridView>
     </ListView.View>
</ListView>

私はこれをテストしていませんが、それはあなたに正しい方向へのプッシュを与えるはずです。

于 2013-01-02T16:56:44.953 に答える