前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

在Silverlight中利用MVVM形式教程代码

时候:2012-02-11 18:31来源:知行网www.zhixing123.cn 编辑:麦田守望者

MVVM:即Model View ViewModel三层,

小我感受归根结底MVVM其实就是MVC的一个变种,ViewModel有一个很较着的长处:可降落View->Control的偶合,像Flash/Silverlight这类RIA利用,在View层中会有很多实现动画结果的代码,而传统的MVC布局,在实现数据更新时,不成避免地要在View中写很多Control代码,如许的话容易造成布局混乱,

但MVVM基于事件绑定机制,在View层中只需完成绑定便可,View会主动更新Model,Model再告诉Control,如许便可年夜量减少View层中的Control代码。

下面举个例子申明:
 

在Silverlight中应用MVVM模式教程代码
 

我们这里有一个可分组的DataGrid控件,现在的需求是: 当用户单击Complete时,实现一些节制操纵,如更新某个图表,或更新背景数据库等。

起首:我们需求建立一个Model,此Model继承INotifyPropertyChanged接口,会强迫实现PropertyChangedEventHandler事件即属性变动事件,在Complete的值产生改变时(View->Model)冒出这个事件。

//Model public class Task :INotifyPropertyChanged { public string ProjectName { get; set; } public string TaskName { get; set; } public DateTime DueDate { get; set; } // Private task data. private bool m_Complete = false; public bool Complete { get { return this.m_Complete; } set { if (value != this.m_Complete) { this.m_Complete = value; NotifyPropertyChanged("Complete"); } } } public string Notes { get; set; } #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion } 然后: 我们需求在Control层中天生绑定命据源,并在数据源上侦听这个属性变动事件(Model->Control),因为多用到泛型调集,所以我们希望在工具被插手调集列表(List)时主动绑定这个事件,是以我们新建一个类以简化这个操纵,究竟上ObservableCollection中已包含了PropertyChangedEventHandler事件 ,多是出于机能的考虑,将其设为了protected范例,并且没有进行任何操纵,是以我们需求新建一个子类来实现他: public class ViewModelCollection<T> : ObservableCollection<T> { public ViewModelCollection():base() { } public new void Add(T item) { //在增加时主动绑定 ((INotifyPropertyChanged)item).PropertyChanged += new PropertyChangedEventHandler(ViewModelCollection_PropertyChanged); base.Add(item); } #region INotifyPropertyChanged 成员 public new event PropertyChangedEventHandler PropertyChanged; void ViewModelCollection_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (PropertyChanged != null) { //继续向上莽撞事件,并通报产生改变的工具 PropertyChanged(sender, new PropertyChangedEventArgs(e.PropertyName)); } } #endregion } 接着: 我们便可以在ViewModel中利用这个泛型调集了,并增加对属性变动事件的侦听。 这里利用的PagedCollectionView工具仅仅是为DataGrid控件供应分组数据源,这也是一个相当强年夜的类,年夜家可以查阅相当文档学习他的利用。 //ViewModel public class ViewModel { public PagedCollectionView TaskBinding() { // 天生泛型调集数据源。 ViewModelCollection<Task> taskList = new ViewModelCollection<Task>(); for (int i = 1; i <= 14; i++) { taskList.Add(new Task() { ProjectName = "Project " + ((i % 3) + 1).ToString(), TaskName = "Task " + i.ToString(), DueDate = DateTime.Now.AddDays(i), Complete = (i % 2 == 0), Notes = "Task " + i.ToString() + " is due on " + DateTime.Now.AddDays(i) + ". Lorum ipsum..." }); } taskList.PropertyChanged += new PropertyChangedEventHandler(taskList_PropertyChanged); PagedCollectionView taskListView = new PagedCollectionView(taskList); // 增加要进行分组的属性 taskListView.GroupDescriptions.Add(new PropertyGroupDescription("ProjectName")); taskListView.GroupDescriptions.Add(new PropertyGroupDescription("Complete")); return taskListView; } void taskList_PropertyChanged(object sender, PropertyChangedEventArgs e) { Task task = (Task)sender; MessageBox.Show(string.Format("Model Changed: IsComplete={0} PropertyName={1}", task.Complete, e.PropertyName)); //其他一些操纵,如更新数据库,图表等 } }
最后: 我们便可以在View层中进行数据绑定了
public partial class MainPage : UserControl
{
private ViewModel controller;

public MainPage()
{
InitializeComponent();

controller = new ViewModel();
dataGrid1.ItemsSource = controller.TaskBinding();
}
}

最后看一看结果:当用户单击Complete列的挑选框时就会触发Control中的节制代码,从而不需求在View中誊写分外的代码

 


完整代码:
xaml文件:
<UserControl x:Class="DataGridGrouping.MainPage"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="600" Height="500">
<Grid x:Name="LayoutRoot" Background="White" Margin="10">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<data:DataGrid x:Name="dataGrid1">
<data:DataGrid.RowGroupHeaderStyles>
<!-- Style for groups at top level -->
<Style TargetType="data:DataGridRowGroupHeader">
<Setter Property="PropertyNameVisibility" Value="Collapsed" />
<Setter Property="Background" Value="#FF112255" />
<Setter Property="Foreground" Value="#FFEEEEEE" />
<Setter Property="SublevelIndent" Value="15" />
</Style>
<!-- Style for groups under the top level -->
<Style TargetType="data:DataGridRowGroupHeader">
<Setter Property="Background" Value="#44225566" />
</Style>
</data:DataGrid.RowGroupHeaderStyles>
</data:DataGrid>
</Grid>
</UserControl>


CS:文件:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Collections.Specialized;
using System.Collections.Generic;

namespace DataGridGrouping
{
public partial class MainPage : UserControl
{
private ViewModel controller;

public MainPage()
{
InitializeComponent();

controller = new ViewModel();
dataGrid1.ItemsSource = controller.TaskBinding();
}
}

//ViewModel
public class ViewModel
{
public PagedCollectionView TaskBinding()
{
// 天生泛型调集数据源。
ViewModelCollection<Task> taskList = new ViewModelCollection<Task>();
for (int i = 1; i <= 14; i++)
{
taskList.Add(new Task()
{
ProjectName = "Project " + ((i % 3) + 1).ToString(),
TaskName = "Task " + i.ToString(),
DueDate = DateTime.Now.AddDays(i),
Complete = (i % 2 == 0),
Notes = "Task " + i.ToString() + " is due on "
+ DateTime.Now.AddDays(i) + ". Lorum ipsum..."
});
}
taskList.PropertyChanged += new PropertyChangedEventHandler(taskList_PropertyChanged);

PagedCollectionView taskListView = new PagedCollectionView(taskList);
// 增加要进行分组的属性
taskListView.GroupDescriptions.Add(new PropertyGroupDescription("ProjectName"));
taskListView.GroupDescriptions.Add(new PropertyGroupDescription("Complete"));

return taskListView;
}

void taskList_PropertyChanged(object sender, PropertyChangedEventArgs e)

------分开线----------------------------
标签(Tag):C# C#实例教程 c#根本教程 C#源代码 c#技能
------分开线----------------------------
保举内容
猜你感兴趣