28/10/2016

[WPF] Create Simple WPF App With MVVM and Validation - Part III


[Editing]
Trong 2 phần trước, ta đã có một demo cơ bản về cách sử dụng mô hình MVVM, sử dụng Entity Framework (Code First, EF này là EF core 7 nên một vài lệnh hơi khác một tí, nhưng nếu bạn quay lại đọc EF 6 thì vẫn không có gì trở ngại). Hôm nay, tiếp nối một phần rất quan trọng đó là Validation. Validation ở đây là muốn dữ liệu input, output không bị lỗi sai kiểu dữ liệu, mọi thứ nằm trong tầm kiểm soát giới hạn, nói chung là phải đúng như thiết kế ban đầu.


Trước khi vào ví dụ validate dữ liệu, ta cần biết một vài điều sau


Binding
Giúp lấy dữ liệu từ code-behind lên view XAML và ngược lại. Không nói đến việc gán dữ liệu kiểu truyền thống như Winforms bằng cách lấy Name của TextBox rồi gán Text cho nó trong code-behind, ở đây ta đang làm theo MVVM. Tất nhiên không ai cấm bạn đưa toàn bộ code từ ViewModel lên Code-Behind của file XAML, điều đó chẳng ảnh hưởng gì, chỉ việc Set DataContext = this, và ta có thể Binding như cũ. OK Nhưng sinh ra mô hình MVVM để đáp ứng nhiều nhu cầu, một trong số đó là tesing nên move hết code-behind về ViewModel. Một nhu cầu để sử dụng MVVM nữa là việc tách Code-Behind ra khỏi View là cho phép Designer thiết kế giao diện thoải mái trên Blend trong khi đó Coder vẫn đang miệt mải code logic và tesing, không ai phải chờ đợi ai cả!
(Đừng quên là bạn có thể Binding hầu như mọi Properties của Control nhé, chẳng hạn như Text, Color, Icon, Size, Event...)

Mode
Cho phép kiểu Binding
  • OneWay: Chỉ chuyển dữ liệu từ ViewModel  lên View
  • TwoWay: Vừa nhận dữ liệu lên View từ ViewModel như OneWay, vừa đưa dữ liệu xuống ViewModel từ View
  • OneTime: Giống OneWay nhưng nó chỉ làm 1 lần khi khởi tạo hoặc DataContext thay đổi lần đầu. 
  • OneWayToSource: Ngược lại OneWay, chỉ lấy dữ liệu từ View xuống ViewModel
  • Default: Cái này phụ thuộc vào control
  • Không khai báo Mode thì mặc định là OneWay

UpdateSourceTrigger
Thiết lập thời gian lúc nào thì được binding khi thay đổi dữ liệu. Nó chỉ làm việc khi mode là TwoWay hoặc OneWayToSource ngược lại sẽ không có tác dụng. Vì mục đích là kiểm soát input
  • Default: Mặc định hầu hết các thuộc tính là PropertyChanged chỉ có thuộc tính Text là LostFocus.
  • Explicit: Chỉ binding khi bạn gọi phương thức UpdateSource.
  • LostFocus: Binding ngay khi Lostfocus khỏi control
  • PropertyChanged: Binding ngay khi thuộc tính thay đổi. Ví dụ bạn set điều này cho thuộc tính Text thì mỗi khi gõ 1 ký tự, binding lập tức thực thi. Như vậy khá tốn hiệu năng, trừ trường hợp yêu cầu đặc biệt trong nghiệp vụ.

Converter
Cho phép bạn triển khai 2 phương thức, một là convert giá trị từ dưới ViewModel lên, thứ hai là convert giá trị từ View xuống ViewModel. Làm như vậy để mần chi?!

Ví dụ:
Giờ tôi muốn TextBox hiển trị giới tính Nam/Nữ tương ứng True/False. Thì bây giờ ta tạo một property kiểu bool dưới ViewModel sau đó binding cho Text property của TextBox.


Created: 28/10/2016

Share

Happy Reading!

[WPF] Create Simple WPF App With MVVM and Validation - Part III
4/ 5
Oleh

Buzz!

Stay updated via email new newsletter

Don't
Use obscene or offensive language.
Personally attack people, their edits, or their comments.
Rant or otherwise harass, abuse, or intimidate others.
Post anything you don't want the world to see. This is a public space.
Infringe copyright.