Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wpfmvvmef简单示例_Wpf_Mvvm - Fatal编程技术网

wpfmvvmef简单示例

wpfmvvmef简单示例,wpf,mvvm,Wpf,Mvvm,我希望有人能帮我把这个简单的wpfmvvm示例启动,因为我正在努力将数据导入视图模型 我有一个SQL表,其中每个记录都有一个时间戳,然后是一个数值,例如 对数时间------------温度 2013年1月1日00:00--60 2013年1月1日00:05--61.1 2013年1月1日00:10--61.2 我的WPF视图将有一个开始日期时间和结束日期时间选择器以及一个gridview,允许用户从日期范围中选择记录,然后在网格中显示它们 我的模型是实体框架,所以我正在努力的是视图模型需要什么

我希望有人能帮我把这个简单的wpfmvvm示例启动,因为我正在努力将数据导入视图模型

我有一个SQL表,其中每个记录都有一个时间戳,然后是一个数值,例如

对数时间------------温度
2013年1月1日00:00--60
2013年1月1日00:05--61.1
2013年1月1日00:10--61.2

我的WPF视图将有一个开始日期时间和结束日期时间选择器以及一个gridview,允许用户从日期范围中选择记录,然后在网格中显示它们

我的模型是实体框架,所以我正在努力的是视图模型需要什么,linq查询将在哪里传递用户输入的开始和结束日期时间。我通常会绘制数据图表,并且有一个明确的要求(scichart)来使用数据的可观察集合。但我只是想得到一个非常简单的数据示例,看看数据库数据是如何在ViewModel中作为可观察的集合获得的,以便绑定到视图。我的GridView也使用Telerik WPF控件,我知道它们可能会做不同的事情


正如你所知,我是一个完全的初学者,在任何地方都很难找到一个简单的示例(大量复杂的示例),因此非常感谢您的帮助。

这实际上是一个相当大的主题。然而,为了保持简单,并暂时排除设计模式和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>
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
这将把视图的DataContext设置为新的ViewModel

正如我前面提到的,这个示例不尝试涉及任何MVVM框架,也不使用任何适当的设计模式

您真的应该为数据使用存储库模式。在这个存储库中,您可以放置Linq to Entities代码,只向ViewModel返回一个ObservableCollection

你会创造一个解决方案

  • 一个可以容纳你的环境足迹的项目
  • 数据库存储库项目
  • 主应用程序的项目,该项目将为您的视图、视图模型、类、行为等设置文件夹

然而,我希望这能让你走

创建一个视图模型,并使其看起来像这样:

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>
public类YourViewModel:INotifyPropertyChanged
{
私有可观测集合(your models);;
公共可观测集合模型
{
获取{return\u yourModels;}
设置
{
_你的模型=价值;
RaisePropertyChanged(()=>this.YourModels);
}
}
私人日期时间(startTime);;
公共日期时间开始时间
{
获取{return\u startTime;}
设置
{
if(value==\u startTime)返回;
_开始时间=价值;
RaisePropertyChanged(()=>this.StartTime);
}
}
私有日期时间_endTime;
公共日期时间发送时间
{
获取{return\u endTime;}
设置
{
if(value==\u endTime)返回;
_结束时间=值;
RaisePropertyChanged(()=>this.SendTime);
}
}
公共视图模型()
{
YourModels=新的ObservableCollection();
//
//您需要将数据加载到ObservableCollection中
//
}
}
现在在视图中,您需要绑定到属性和集合。大概是这样的:

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>


我还没有测试过这个,但它应该会给你一个正确的方向。

谢谢你提供的信息,这正是我想要的。不过还有一件事。将数据加载到可观察集合中的最佳方法是什么。这会是一个linq查询并循环搜索结果并添加每条记录吗?@ColinWright…您可以通过多种方式获得结果,其中一种是linq查询。无需对结果进行循环,只需返回一个IEnumerable并将其设置为集合。我建议您创建一个处理数据交互的数据访问类。谢谢您,这正是我想要的