我正在使用MVVMLight。这是我的Department
模型/ POCO类。我不想以任何方式污染它。如何从ViewModel中分离ViewModel属性验证?
public partial class Department
{
public int DepartmentId { get; set; }
public string DepartmentCode { get; set; }
public string DepartmentFullName { get; set; }
}
这里是CreateDepartmentViewModel
:
public class CreateDepartmentViewModel : ViewModelBase
{
private IDepartmentService departmentService;
public RelayCommand CreateDepartmentCommand { get; private set; }
public CreateDepartmentViewModel(IDepartmentService DepartmentService)
{
departmentService = DepartmentService;
this.CreateDepartmentCommand = new RelayCommand(CreateDepartment, CanExecute);
}
private Department _department = new Department();
public Department Department
{
get
{
return _department;
}
set
{
if (_department == value)
{
return;
}
_department = value;
RaisePropertyChanged("Department");
}
}
private Boolean CanExecute()
{
return true;
}
private void CreateDepartment()
{
bool success = departmentService.SaveDepartment(_department);
}
}
的DepartmentCode
和DepartmentFullName
被结合(如下所示)的用户界面。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="Department Code" Grid.Row="0"/>
<TextBox Grid.Row="0" Text="{Binding Department.DepartmentCode, Mode=TwoWay}" Margin="150,0,0,0"/>
<TextBlock Text="Department Name" Grid.Row="1"/>
<TextBox Grid.Row="1" Text="{Binding Department.DepartmentFullName, Mode=TwoWay}" ToolTip="Hi" Margin="150,0,0,0"/>
<Button Grid.Row="2" Content="Save" Width="50" Command="{Binding CreateDepartmentCommand}"/>
</Grid>
之前保存处,我需要验证两个DepartmentCode
和DepartmentFullName
中有一些文字。
我的验证逻辑应该放在哪里?在ViewModel本身?如果是这样,我如何分离我的验证逻辑,以便它也是单元可测试的?
我认为最好的方法是在你的模型类中实现'IDataErrorInfo'。这可能会“污染”一点点,但最好练习检查[this](http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5 .aspx)post –
这就是我不想做的事情。我不想污染我的模型,因为它与MVC项目共享。还有其他方法吗? – NoobDeveloper
我现在无法输入示例,但为何直接绑定到您的模型?只需在ViewModel中包装这两个属性,让ViewModel实现IDataErrorInfo(而不是更改模型)并在其中实现验证逻辑。然后绑定到ViewModel.DepartmentCode而不是ViewModel.Department.DepartmentCode。您的验证业务逻辑需要驻留在您的Model或ViewModel中......因为您不想更改模型,所以将其包装在ViewModel中是另一种选择。 – Alan