Tôi đang sử dụng MVVMLight. Đây là mẫu Department
/POCO của tôi. Tôi không muốn làm ô nhiễm nó bằng bất kỳ phương tiện nào.Làm thế nào để bạn decouple xác nhận tài sản ViewModel của bạn từ ViewModel?
public partial class Department
{
public int DepartmentId { get; set; }
public string DepartmentCode { get; set; }
public string DepartmentFullName { get; set; }
}
Đây là 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);
}
}
Các DepartmentCode
và DepartmentFullName
được liên kết với giao diện người dùng như hình dưới đây.
<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>
Trước khi lưu các Sở, tôi cần phải xác nhận rằng cả hai DepartmentCode
và DepartmentFullName
có một số văn bản trong đó.
Logic hợp lệ của tôi nên ở đâu? Trong chính ViewModel? Nếu vậy, làm thế nào để tôi decouple logic xác nhận của tôi để nó cũng là đơn vị testable?
Tôi nghĩ rằng cách tốt nhất là thực hiện 'IDataErrorInfo' trong lớp Model của bạn. Điều này có thể 'gây ô nhiễm' nó một chút nhưng nó là kiểm tra thực hành tốt nhất [this] (http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5 .aspx) post –
Đó là những gì tôi không muốn làm. Tôi không muốn gây ô nhiễm cho Mô hình của mình vì nó được chia sẻ với dự án MVC. Có cách tiếp cận nào khác không? – NoobDeveloper
Tôi không thể nhập một ví dụ ngay bây giờ, nhưng tại sao lại liên kết trực tiếp với mô hình của bạn? Chỉ cần bọc 2 thuộc tính đó hoặc như vậy trong ViewModel của bạn, có ViewModel của bạn thực hiện IDataErrorInfo (thay vì thay đổi Model của bạn) và thực hiện logic hợp lệ ở đó. Sau đó, liên kết với ViewModel.DepartmentCode không ViewModel.Department.DepartmentCode. Hoặc logic nghiệp vụ xác nhận của bạn cần phải nằm trong Mô hình của bạn hoặc ViewModel ... Vì bạn không muốn thay đổi mô hình, gói nó trong ViewModel là tùy chọn khác. – Alan