wpfmvvmef简单示例
我希望有人能帮我把这个简单的wpfmvvm示例启动,因为我正在努力将数据导入视图模型 我有一个SQL表,其中每个记录都有一个时间戳,然后是一个数值,例如 对数时间------------温度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,允许用户从日期范围中选择记录,然后在网格中显示它们 我的模型是实体框架,所以我正在努力的是视图模型需要什么
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并将其设置为集合。我建议您创建一个处理数据交互的数据访问类。谢谢您,这正是我想要的