8,756
社区成员




namespace ╳╳╳.Web.Models
{
using System;
using System.ComponentModel.DataAnnotations;
public partial class Student
{
[Display(Name="年龄", Order=100)]
public int Age
{
get { return DateTime.Now.Year - Birthday.Year; }
}
}
}
namespace ╳╳╳.Web.Models
{
using System.ComponentModel.DataAnnotations;
public class CheckDataValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
Student student = value as Student;
return student.GradurationDay > student.EnrolmentDay ? ValidationResult.Success : new ValidationResult("入学日期不能大于毕业日期");
}
}
}
namespace ╳╳╳.Web.Models
{
public partial class Student
{
//用于显示已经毕业后已经过了几天
[Display(Name = "毕业已经过了(天)", Order = 200)]
public int DatePassed
{
get
{
return (DateTime.Now - GradurationDay).Days;
}
}
}
}
//Home.xaml.cs
private StudentDomainContext _context = new StudentDomainContext();
public Home()
{
InitializeComponent();
this.Title = ApplicationStrings.HomePageTitle;
this.Loaded += (s, e) =>
{
EntityQuery<Student> q = _context.GetStudentsQuery();
q = from student in q.Take(1)
select student;
_context.Load(q, lo => myDataForm.ItemsSource = lo.Entities, null);
};
}
<tookit:DataForm x:Name="myDataForm" CurrentItem="{Binding}" AutoCommit="False" />
[Display(AutoGenerateField = false)]
public int Id { get; set; }
[Display(Name = "姓名", Order = 5)]
public string Name { get; set; }
[Display(Name="生日", Order=10)]
public DateTime Birthday { get; set; }
[Display(Name = "入学日期", Order = 15)]
public DateTime EnrolmentDay { get; set; }
[Display(Name = "毕业日期", Order = 20)]
public DateTime GradurationDay { get; set; }
public class SimpleStudentVM
{
public Student FirstStudent
{
get { return new Student { Id = 1, Name = "张华", Age = 25 }; }
}
}
public class WrappedStudentVM
{
public StudentViewModel FirstStudent
{
get { return new StudentViewModel(new Student { Id = 1, Name = "张华", Age = 25 }); }
}
}
public class StudentViewModel : NotificationObject
{
private Student _student;
public StudentViewModel(Student s)
{
_student = s;
}
public int Id
{
get { return _student.Id; }
set
{
_student.Id = value;
RaisePropertyChanged("Id");
}
}
public string Name
{
get { return _student.Name; }
set
{
_student.Name = value;
RaisePropertyChanged("Name");
}
}
public int Age
{
get { return _student.Age; }
set
{
_student.Age = value;
RaisePropertyChanged("Age");
}
}
}
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel>
<StackPanel.DataContext>
<vm:SimpleStudentVM />
</StackPanel.DataContext>
<tookit:DataForm CurrentItem="{Binding FirstStudent}" />
</StackPanel>
<StackPanel Grid.Column="1">
<StackPanel.DataContext>
<vm:WrappedStudentVM />
</StackPanel.DataContext>
<tookit:DataForm CurrentItem="{Binding FirstStudent}" />
</StackPanel>
</Grid>
可以看出来自动生成的Entity被ViewModel包装后再绑定DataForm时,因为它没有实现IEditableObject,所以不能参与进Cancel(实际就是Undo),界面上也不会显示Cancel按钮。且绑定自定义ViewModel后,必录项对应Label加粗也没了。
当然可以在自定义ViewModel时,实现IEditableObject,使实体对应ViewModel获得可以Undo的好处,还有用[Required]等重新标识必录项。问题是, 这是不是很繁琐呢?
所以就回到我最开始的问题了,既然RiaServices自动生成的Entity这么强大,还有很多方面都面面俱到(它还默认实现了INotifyDataErrorInfo,你想,如果在自己的ViewModel里再去实现这个接口……),因为DataForm直接绑定的是经过‘缩减’的对象,在这种情况下反不如直接绑定RiaServices自动生成的entity.
[/quote]
所以才会把Model作为ViewModel的一个属性来,然后你要修改的部分就直接绑在Model上,毕竟这个Model本身不能扩展的。
public class SimpleStudentVM
{
public Student FirstStudent
{
get { return new Student { Id = 1, Name = "张华", Age = 25 }; }
}
}
public class WrappedStudentVM
{
public StudentViewModel FirstStudent
{
get { return new StudentViewModel(new Student { Id = 1, Name = "张华", Age = 25 }); }
}
}
public class StudentViewModel : NotificationObject
{
private Student _student;
public StudentViewModel(Student s)
{
_student = s;
}
public int Id
{
get { return _student.Id; }
set
{
_student.Id = value;
RaisePropertyChanged("Id");
}
}
public string Name
{
get { return _student.Name; }
set
{
_student.Name = value;
RaisePropertyChanged("Name");
}
}
public int Age
{
get { return _student.Age; }
set
{
_student.Age = value;
RaisePropertyChanged("Age");
}
}
}
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel>
<StackPanel.DataContext>
<vm:SimpleStudentVM />
</StackPanel.DataContext>
<tookit:DataForm CurrentItem="{Binding FirstStudent}" />
</StackPanel>
<StackPanel Grid.Column="1">
<StackPanel.DataContext>
<vm:WrappedStudentVM />
</StackPanel.DataContext>
<tookit:DataForm CurrentItem="{Binding FirstStudent}" />
</StackPanel>
</Grid>