In lạiTác giả: Tôi là chú chim nhỏThời gian cập nhật: 24-06-2023 22:32:15284
Chúng ta nhìn thế giới sai và nói rằng nó đã lừa dối chúng ta. --Bộ sưu tập chim.
Lời nói đầu
Để so sánh, lệnh là một khái niệm mới đối với tôi, vì không có khái niệm nào như lệnh trong Winform. Từ góc độ nghĩa đen, "lệnh" có thể đề cập đến một hướng dẫn hoặc yêu cầu rõ ràng được sử dụng để truyền đạt một hoạt động hoặc hành vi cụ thể tới một thực thể. Nó có thể là một từ bằng lời nói thể hiện yêu cầu hoặc hướng dẫn đối với một đối tượng hoặc chủ đề. Các lệnh thường có mục tiêu và nội dung thực hiện rõ ràng. Chúng cho người nhận biết phải làm gì và hạn chế hành vi ở một mức độ nào đó.
Trong phát triển phần mềm, "lệnh" là một mẫu thiết kế mô tả cách đóng gói các hoạt động dưới dạng đối tượng để sử dụng và tái sử dụng trong các ngữ cảnh khác nhau. Mẫu lệnh này tách rời người gửi và người nhận bằng cách đóng gói các yêu cầu và hoạt động vào một đối tượng lệnh, từ đó đạt được thiết kế linh hoạt và có thể mở rộng hơn. Trong chế độ này, đối tượng lệnh đóng vai trò trung gian giữa người gửi và người nhận và người nhận hoàn thành một thao tác cụ thể bằng cách thực thi đối tượng lệnh.
Khi nói về mệnh lệnh, chúng ta thường so sánh chúng với các sự kiện. Tất cả chúng ta đều biết rằng đã có các sự kiện được định tuyến trong WPF, chẳng hạn như phản ứng của một nút sau khi được nhấp vào (sự kiện trực tiếp). Chúng ta thường tạo một sự kiện mới thông qua Nhấp chuột vào Nút và sau đó viết một số mã nghiệp vụ trong sự kiện này:
Khi chúng ta chạy chương trình và nhấp vào nút, sự kiện Button_Click sẽ xuất hiện hộp thoại thông báo phản hồi lại hành động nhấp chuột. Không có vấn đề gì phải không? Tất cả chúng ta đều biết rằng trong các khung GUI ban đầu, không có sự tách biệt thực sự giữa giao diện và cách ứng dụng hoạt động, và điều tương tự cũng được áp dụng ở đây. Viết mã nghiệp vụ trực tiếp trong trình xử lý sự kiện sẽ khiến giao diện và logic nghiệp vụ được kết hợp chặt chẽ với nhau. , khiến cả hai khó có thể tách rời và thay đổi độc lập. Trong quá trình phát triển thực tế, chúng tôi sẽ cung cấp cho nút một chức năng cụ thể. Khi chức năng của nút thay đổi, chúng tôi cần sửa đổi những thứ liên quan đến chức năng này trong giao diện UI và cũng cần điều chỉnh mã nghiệp vụ dẫn đến giao diện. các phần tử (Giao diện) và logic nghiệp vụ (hành vi) được trộn lẫn với nhau, do đó mã XAML của nút đảm nhận cả định nghĩa về diện mạo và việc triển khai logic nghiệp vụ. Ngoài ra, giả sử chúng ta có nhiều nút giống nhau thì chúng ta đều cần cung cấp chức năng giống nhau sau khi người dùng nhấp vào nút. Thông qua phương pháp trên, khi chức năng này thay đổi, chúng ta cần điều chỉnh từng nút liên quan và các sự kiện tương ứng. Để giải quyết vấn đề này, WPF cung cấp một cơ chế lệnh (Command) có thể tách biệt hành vi của nút với hình thức bên ngoài của nó.
Các lệnh trong WPF là một cơ chế xử lý các tương tác giao diện người dùng. Chúng cung cấp cách tách riêng các thành phần giao diện (UI) và logic nền để các hoạt động tương tác có thể được thực hiện một cách thống nhất, được xử lý theo cách có thể sử dụng lại. Khái niệm và cách triển khai các lệnh WPF dựa trên mẫu kiến trúc MVVM (Model-View-ViewModel), cho phép quản lý và xử lý các hoạt động tương tác của các thành phần giao diện thông qua các đối tượng lệnh mà không cần phải viết trực tiếp các trình xử lý sự kiện vào mã giao diện.
Bằng cách sử dụng các lệnh, chúng ta có thể tổ chức và quản lý các hành vi tương tác giao diện tốt hơn, làm cho cấu trúc mã rõ ràng, dễ bảo trì và mở rộng. Đồng thời, lệnh còn cung cấp thêm một số chức năng như truyền tham số, kiểm soát tính khả dụng của lệnh, v.v., cho phép chúng ta xử lý các thao tác của người dùng linh hoạt hơn.
Sự kiện và lệnh:
Các sự kiện được liên kết với hành động của người dùng, trong khi lệnh là những hành động muốn tách biệt khỏi giao diện, chẳng hạn như lệnh sao chép và dán thông thường. Khi chúng ta nhấp vào nút có chức năng sao chép, nó tương đương với việc kích hoạt một lệnh sao chép. - tương tác giao diện trở nên đơn giản hơn, khả năng sử dụng lại mã được cải thiện và giao diện người dùng có thể được điều khiển linh hoạt hơn mà không phá hủy logic nền.
mô hình lệnh
Mô hình lệnh WPF chủ yếu chứa các thành phần cơ bản sau:
Lệnh: đề cập đến một lớp thực hiện giao diện ICommand, chẳng hạn như lớp RoutedCommand và lớp con RoutedUICommand của nó, thường không chứa logic cụ thể.
Nguồn lệnh: Người gửi lệnh, đề cập đến lớp thực hiện giao diện ICommandSource. Các thành phần giao diện như Button và MenuItem đều triển khai giao diện này và việc nhấp vào chúng sẽ thực thi các lệnh bị ràng buộc.
Mục tiêu lệnh: Người nhận lệnh, đề cập đến lớp thực hiện giao diện IInputElement.
Ràng buộc lệnh: Liên kết một số logic ngoại vi với các lệnh.
Hãy dùng hình ảnh của cô Lưu để xem xét mối quan hệ của họ.
Lệnh ICommand
Giao diện ICommand chứa hai phương thức cho một sự kiện:
giao diện công cộng ICommand { // // Tóm tắt: // Xảy ra khi có một thay đổi xảy ra ảnh hưởng đến việc lệnh có được thực thi hay không. event EventHandler CanExecuteChanged; // Tóm tắt: // Xác định phương thức được sử dụng để xác định xem lệnh này có thể được thực thi ở trạng thái hiện tại hay không. // // Tham số: // tham số: // Dữ liệu được sử dụng bởi lệnh này. Đối tượng này có thể được đặt thành null nếu lệnh này không yêu cầu truyền dữ liệu. // // Trả về kết quả: // true nếu lệnh này có thể được thực thi; nếu không thì trả về false. bool CanExecute(object tham số); // // Tóm tắt: // Xác định phương thức được gọi khi lệnh này được gọi. // // Tham số: // tham số: // Dữ liệu được sử dụng bởi lệnh này. Đối tượng này có thể được đặt thành null nếu lệnh này không yêu cầu truyền dữ liệu. void Thực thi(tham số đối tượng); }
Nhìn nó theo cách khác:
Thực hiện - thực hiện một hành động.
CanExecute - liệu hành động có thể được thực thi hay không.
CanExecuteChanged - Một sự kiện được phản hồi khi xảy ra thay đổi trạng thái lệnh.
Bằng cách triển khai giao diện ICommand, chúng ta có thể tạo các đối tượng lệnh tùy chỉnh và liên kết chúng với các thành phần giao diện. Bằng cách này, các phần tử giao diện có thể được liên kết với các lệnh và thực hiện các thao tác cụ thể bằng cách gọi phương thức Thực thi của lệnh mà không cần viết trực tiếp các trình xử lý sự kiện.
xác định lệnh
Tiếp theo, chúng ta thử sử dụng các lệnh để thực hiện sự kiện click trên và dần dần hiểu được nội dung trong mô hình. Chúng tôi tạo một lớp MainViewModel mới để cung cấp các phương thức chức năng mà chúng tôi cần:
sử dụng System.Windows; không gian tên WPFDemo { lớp công khai MainViewModel { void công khai ShowInfo() { MessageBox.Show("Bạn nhấp vào tôi."); } } }
ShowInfo() lúc này tách biệt với giao diện UI phải không? Sau khi có phương thức, chúng ta có thể nói rằng lệnh ShowInfo trong MainViewModel là chưa đủ theo mô hình. Tiếp tục viết một lớp triển khai giao diện ICommand nhưng không có logic cụ thể, chẳng hạn như CustomCommand
sử dụng System; sử dụng System.Windows.Input; không gian tên WPFDemo { lớp công khai CustomCommand : ICommand { Hành động chỉ đọc riêng tư _execute; public CustomCommand(Action exec) { _execute = exec } sự kiện công khai EventHandler CanExecuteChanged; / Triển khai logic thực thi của lệnh ở đây return true; // Trả về true theo mặc định, cho biết lệnh có thể thực thi được} public void Thực thi (tham số đối tượng) { // Triển khai logic thực thi của lệnh here_execute?.Invoke() } } }
Sau đó, bạn cần thêm thuộc tính công khai trong lớp MainViewModel để hiển thị phiên bản CustomCommand dưới dạng ShowInfoCommand để liên kết trong XAML.
sử dụng System.Windows; không gian tên WPFDemo { lớp công khai MainViewModel { lệnh CustomCommand công khai ShowInfoCommand { lấy; đặt; } lệnh MainViewModel() { lệnh ShowInfoCommand = lệnh CustomCommand mới (ShowInfo); } lệnh void ShowInfo() { MessageBox.Show("Bạn nhấp vào tôi."); } } }
Cuối cùng, liên kết phiên bản CustomCommand với thành phần giao diện:
Việc đặt bối cảnh dữ liệu cũng có thể được thực hiện bằng mã phía sau.
Quay lại mô hình lệnh, sắp xếp các tương ứng sau:
Lệnh tùy chỉnh Bản thân lớp này là một đối tượng lệnh ( Lệnh ICommand ), thực hiện giao diện lệnh, bao gồm Thực hiện Và Có thể thực hiện phương pháp. Đối tượng lệnh này là "lệnh cụ thể" trong chế độ lệnh.
MainViewModel Lớp này đóng vai trò là người thực thi lệnh (hoặc đích lệnh), chứa Hiển thịThông tin phương pháp. Trong mẫu lệnh, người thực thi chịu trách nhiệm về các hành động thực tế cần thiết để thực thi lệnh. Trong ví dụ của chúng tôi, Hiển thịThông tin Các phương thức được thực thi logic nghiệp vụ cụ thể.
hiện hữu XAML , chúng tôi sử dụng Liên kết lệnh Thay đổi nút Nhấp chuột sự kiện và Hiển thị lệnh thông tin Liên quan. Sự liên kết này thông qua Cửa sổ hoặc Kiểm soát người dùng của Liên kết lệnh Thêm một cái mới vào bộ sưu tập Liên kết lệnh đối tượng cần hoàn thành. cái này Liên kết lệnh được chỉ định Hiển thị lệnh thông tin như một mệnh lệnh và MainViewModel Với tư cách là người thi hành mệnh lệnh.
Lưu ý: Thuộc tính Lệnh chỉ được sử dụng làm ràng buộc cho hành vi Nhấp chuột, các hành vi khác, chẳng hạn như di chuyển chuột vào và ra. . . Đối với các hành vi khác, bạn cần sử dụng phương thức MVVM khác để liên kết.
Cuối cùng, sắp xếp cấu trúc chương trình, bạn có thể thấy rằng chúng tôi viết mã nghiệp vụ và logic trong MainViewModel.cs và MainWindow.xaml tương ứng.
Thông báo thay đổi
Trong WPF, thông báo về các thay đổi thuộc tính được thực hiện bằng cách triển khai giao diện INotifyPropertyChanged. Giao diện này xác định một sự kiện PropertyChanged Khi giá trị của thuộc tính thay đổi, sự kiện này có thể được kích hoạt để thông báo cho giao diện cập nhật.
Trước khi trình diễn, hãy xem liệu ví dụ chúng tôi sử dụng ở trên có thể được cập nhật tự động giống như liên kết mà chúng tôi đã học trước đó hay không. Theo logic phân tách nghiệp vụ, chúng tôi thêm trường Tên vào MainViewModel.cs và liên kết nó trên trang.
MainViewModel.cs:
sử dụng System.Windows; không gian tên WPFDemo { public class MainViewModel { public CustomCommand ShowInfoCommand { set; } public string Name { get; CustomCommand (ShowInfo); } public void ShowInfo() { Name = "hói đầu mạnh mẽ"; Tôi."); } } }
Cửa sổ chính.xaml:
Ngữ cảnh dữ liệu trong xaml trước đây không tốt lắm và cần được xác định một lần trong mỗi điều khiển.
Trong đoạn mã trên, chúng tôi liên kết Tên với văn bản của TextBox và thay đổi giá trị của Tên khi nhấp vào nút. Nếu nó có thể thông báo thay đổi và cập nhật tự động thì văn bản cũng sẽ thay đổi khi Tên thay đổi. Phải. Hãy thử nó bằng cách chạy:
Có thể thấy Text không thay đổi khi Name thay đổi, tức là Text không được thông báo thay đổi sau khi Name thay đổi. Nếu thích mày mò, bạn có thể xem Tên có thay đổi nếu Văn bản được sửa đổi hay không.
Quay lại chủ đề, như đã đề cập ở trên, thay đổi thông báo của thuộc tính được triển khai bằng cách triển khai giao diện INotifyPropertyChanged. Hãy sửa đổi một chút MainViewModel.cs tùy chỉnh để triển khai thay đổi thông báo của thuộc tính:
sử dụng System.ComponentModel; sử dụng System.Windows; không gian tên WPFDemo { public class MainViewModel : INotifyPropertyChanged { public CustomCommand ShowInfoCommand { get; set; } public event PropertyChangedEventHandler PropertyChanged; private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(nameof(Name)); } } private void OnPropertyChanged(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } public MainViewModel() { Name = "Sự kiện thay đổi"; ShowInfoCommand = new CustomCommand(ShowInfo); } public void ShowInfo() { Name = "Sự kiện thay đổi"; MessageBox.Show("Bạn nhấp vào tôi."); } } }
nameof(Name) là một cú pháp được giới thiệu trong C# 6.0. Nó có thể lấy tên của các thuộc tính, phương thức, trường, kiểu và các thành viên khác dưới dạng chuỗi tại thời điểm biên dịch.
Trong WPF, nameof(Name) được sử dụng để chỉ định tên của thuộc tính trong thông báo thay đổi thuộc tính. Mục đích của nó là tránh việc mã hóa cứng tên thuộc tính, từ đó giảm thiểu lỗi do đổi tên thuộc tính trong quá trình tái cấu trúc.
Sau khi sửa đổi, lớp MainViewModel triển khai giao diện INotifyPropertyChanged và thực hiện thông báo thay đổi thuộc tính trong setter của thuộc tính Name. Khi giá trị của thuộc tính Name thay đổi, sự kiện PropertyChanged sẽ được kích hoạt để thông báo cho giao diện cập nhật.
Lối chơi nâng cao
Trong cách triển khai thông báo thay đổi, logic của thay đổi thông báo có thể được xác định trong lớp cơ sở, chẳng hạn như lớp ViewModelBase. Lớp cơ sở này có thể chứa cách triển khai thông báo thay đổi thuộc tính chung để các lớp mô hình dạng xem cụ thể khác có thể kế thừa từ lớp cơ sở này và sử dụng lại các chức năng thông báo thay đổi này.
Dưới đây là một ví dụ đơn giản cho thấy cách triển khai thông báo thay đổi trong lớp ViewModelBase:
sử dụng System.ComponentModel; sử dụng System.Runtime.CompilerServices; không gian tên WPFDemo { lớp công khai ViewModelBase: INotifyPropertyChanged { sự kiện công khai PropertyChangedEventHandler PropertyChanged; được bảo vệ virtual void OnPropertyChanged([CallerMemberName] chuỗi propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
Trong đoạn mã trên, lớp ViewModelBase triển khai giao diện INotifyPropertyChanged và cung cấp phương thức OnPropertyChanged để kích hoạt sự kiện thông báo thay đổi thuộc tính và chuyển tên thuộc tính làm tham số.
Theo mặc định, thuộc tính CallerMemberName được sử dụng để tự động lấy tên của thành viên mà phương thức được gọi, được chuyển làm tên thuộc tính.
Bạn có thể đơn giản hóa việc triển khai thông báo thay đổi thuộc tính trong lớp mô hình khung nhìn của mình bằng cách kế thừa lớp ViewModelBase và sử dụng phương thức OnPropertyChanged để đặt thuộc tính:
MainViewModel.cs:
sử dụng System.Windows; không gian tên WPFDemo { public class MainViewModel : ViewModelBase { public CustomCommand ShowInfoCommand { get; } chuỗi riêng tư Tên chuỗi công khai { get { return _name } set { _name = value; chuỗi _description; chuỗi công khai Mô tả { get { return _description } set { _description = value; OnPropertyChanged(); } } public MainViewModel() { Name = "Súng bắn tỉa số 1 của Gou Xiong Ridge"; Mô tả = "Bald Qiang"; Bald Qiang" ; Description = "Người chơi đột phá số một trong Gou Xiong Ling, MacArthur đã nói như vậy."; MessageBox.Show("Bạn nhấp vào tôi."); } } }
Trong ví dụ này, lớp MainViewModel kế thừa lớp ViewModelBase và sử dụng phương thức OnPropertyChanged để đặt thuộc tính Name. Khi giá trị của thuộc tính Tên thay đổi, phương thức SetProperty sẽ tự động xử lý logic của thông báo thay đổi thuộc tính, loại bỏ nhu cầu kích hoạt sự kiện theo cách thủ công hoặc viết mã trùng lặp.
Bằng cách xác định việc triển khai các thay đổi thông báo trong lớp cơ sở, bạn có thể đạt được mã ngắn gọn hơn, dễ bảo trì và có thể sử dụng lại hơn, đồng thời tránh trùng lặp logic của các thay đổi thông báo trong từng lớp mô hình khung nhìn cụ thể.
Chở hàng riêng - thông số lệnh
Đôi khi chúng ta cần truyền tham số khi thực thi lệnh. Trong WPF, bạn có thể sử dụng thuộc tính CommandParameter để truyền tham số cho lệnh.
CommandParameter là thuộc tính bổ sung cho phép bất kỳ đối tượng nào được chỉ định làm tham số lệnh. Khi lệnh được thực thi, phương thức Thực thi của lệnh sẽ nhận tham số này và có thể sử dụng nó trong logic xử lý lệnh.
Dưới đây là ví dụ cho thấy cách chỉ định CommandParameter cho lệnh trong XAML:
。
Trong ví dụ này, chúng tôi liên kết thuộc tính Command của Button với lệnh MyCommand. Đồng thời, chúng tôi chỉ định tham số chuỗi "Xin chào, Thế giới!" thông qua thuộc tính CommandParameter. Tham số này được chuyển tới phương thức Thực thi của lệnh MyCommand khi nhấp vào nút.
Trong logic thực thi lệnh, giá trị được truyền có thể thu được thông qua các tham số lệnh. Đây là một ví dụ về lớp lệnh đơn giản:
CustomCommand.cs:
sử dụng System; sử dụng System.Windows.Input; không gian tên WPFDemo { public class CustomCommand : ICommand { riêng tư chỉ đọc Action
Lớp CustomCommand chấp nhận một tham số kiểu Action và lưu phương thức đã truyền vào trường _execute trong hàm tạo. Sau đó, trong phương thức Thực thi, thực thi phương thức đã truyền bằng cách gọi _execute?.Invoke(parameter), truyền tham số làm tham số cho phương thức.
Bằng cách này, khi tạo một phiên bản CustomCommand trong MainViewModel, bạn có thể truyền phương thức ShowInfo làm tham số.
MainViewModel.cs
sử dụng System.Windows; không gian tên WPFDemo { lớp công khai MainViewModel { lệnh CustomCommand công khai ShowInfoCommand { lấy; đặt; } lệnh MainViewModel() { lệnh ShowInfoCommand = lệnh CustomCommand mới (ShowInfo); } lệnh void ShowInfo (tham số đối tượng) { lệnh MessageBox.Show (tham số dưới dạng chuỗi); } } }
Vậy các tham số của ShowInfo(object tham số) đến từ đâu - Thuộc tính bổ sung CommandParameter:
Điều này có vẻ ngớ ngẩn. Chúng tôi có thể thực hiện một số điều chỉnh nhỏ để sửa đổi nội dung hiển thị trên trang. Mọi người nên biết:
Thông qua các tham số lệnh, bạn có thể triển khai logic xử lý lệnh linh hoạt hơn và thực hiện các thao tác khác nhau tùy theo các tham số đã truyền. Đồng thời, bạn cũng có thể sử dụng các tham số lệnh để tương tác với các thành phần giao diện, chẳng hạn như truyền thông tin tọa độ dựa trên vị trí nhấp vào nút.
MVVM
Khi giới thiệu các lệnh ở đầu bài viết, chúng tôi đã đề cập rằng khái niệm và cách triển khai các lệnh WPF dựa trên mẫu kiến trúc MVVM (Model-View-ViewModel), đồng thời cũng có thể thấy từ cấu trúc dự án và mã hóa tiếp theo rằng ví dụ này liên quan đến MVVM (Model -View-ViewModel), chúng ta hãy xem MVVM là gì cũng như cách tham chiếu và sử dụng một số khung MVVM chính thống.
MVVM là một mẫu kiến trúc phần mềm, là tên viết tắt của Model (kiểu dữ liệu), View (giao diện) và ViewModel (cầu nối giữa dữ liệu và giao diện). Nó nhằm mục đích tách logic của giao diện người dùng khỏi logic nghiệp vụ để cải thiện tính năng. độ tin cậy của mã, khả năng bảo trì và khả năng mở rộng.
Mẫu MVVM bao gồm ba thành phần cốt lõi sau:
Người mẫu : Model đại diện cho dữ liệu và logic nghiệp vụ của ứng dụng. Nó độc lập với giao diện người dùng và mô hình xem và chịu trách nhiệm xử lý các tác vụ như thu thập, lưu trữ và xử lý dữ liệu.
Xem : View là phần trực quan của giao diện người dùng, chịu trách nhiệm hiển thị dữ liệu và tương tác với người dùng. nó thường là vậy XAML Tệp mô tả bố cục và hình thức của giao diện người dùng. Chế độ xem chỉ nên tập trung vào hình thức và bố cục chứ không phải logic kinh doanh cụ thể.
Chế độ xemMô hình : View model đóng vai trò trung gian giữa view và model. Nó cung cấp khả năng liên kết dữ liệu và xử lý sự kiện cho các khung nhìn bằng cách hiển thị các lệnh và thuộc tính. Mô hình khung nhìn thu thập và xử lý dữ liệu bằng cách tương tác với mô hình và cung cấp dữ liệu đã xử lý cho liên kết khung nhìn dưới dạng thuộc tính. Mô hình khung nhìn cũng chịu trách nhiệm xử lý các tương tác của người dùng và chuyển kết quả của các tương tác sang mô hình để xử lý.
Ưu điểm của mẫu MVVM là nó thực hiện sự tách biệt giữa logic giao diện và logic nghiệp vụ, giúp mã rõ ràng hơn, dễ bảo trì và kiểm tra được. Việc tách rời các khung nhìn và mô hình khung nhìn cho phép chúng được phát triển và thử nghiệm một cách độc lập, đồng thời cung cấp khả năng kiểm tra tốt hơn. Khả năng mở rộng, cho phép sửa đổi và thêm logic nghiệp vụ mà không ảnh hưởng đến chế độ xem.
Tóm lại, mẫu MVVM cung cấp một cách có cấu trúc để phát triển và duy trì các ứng dụng WPF bằng cách tách biệt giao diện người dùng, dữ liệu và logic nghiệp vụ. Nó cho phép các nhà phát triển quản lý mã tốt hơn và làm cho các ứng dụng có khả năng mở rộng và kiểm thử tốt hơn.
Khi xây dựng khung MVVM, có những người phát minh ra bánh xe của riêng mình, như trong ví dụ lệnh trên; cũng có những người sử dụng các dự án mã nguồn mở làm sẵn. Dưới đây là hai gói khung làm sẵn phổ biến.
Ánh sáng Mvvm
Địa chỉ dự án: mvvmlight.
MVVM Light không còn được duy trì nữa. Trong nhiều năm qua, hàng ngàn người dùng đã thấy dự án này hữu ích với hàng triệu lượt tải xuống. Chúng tôi thực sự choáng ngợp trước lòng tốt của rất nhiều thành viên trong cộng đồng tuyệt vời này. Cảm ơn rất nhiều vì đã làm cho dự án nhỏ này trở nên phổ biến và khiến mọi thứ trở nên xứng đáng.
MvvmLight không còn được duy trì. Trong những năm qua, hàng nghìn người dùng đã phát hiện ra dự án này với hàng triệu lượt tải xuống. Chúng tôi thực sự choáng ngợp trước lòng tốt của rất nhiều thành viên trong cộng đồng tuyệt vời này. Cảm ơn bạn rất nhiều vì đã làm cho dự án nhỏ này trở nên phổ biến và khiến nó trở nên đáng giá.
Chúng tôi đặc biệt khuyên bạn nên tìm hiểu Microsoft MVVM Toolkit, một dự án nguồn mở từ Windows Community Toolkit, là phiên bản kế nhiệm của MVVM Light.
Chúng tôi thực sự khuyên bạn nên xem xét Bộ công cụ MVVM của Microsoft, một dự án nguồn mở trong Bộ công cụ cộng đồng Windows với tư cách là dự án kế thừa cho MVVM Light.
MvvmLight là một khung MVVM nhẹ cung cấp nhiều công cụ và chức năng để triển khai mẫu MVVM. Dưới đây là một số tính năng và thành phần chính của MvvmLight:
XemMô hình Lớp cơ sở: Ánh sáng Mvvm cung cấp một ViewModelBase Lớp cơ sở để tạo ra các lớp mô hình chế độ xem tùy chỉnh. Lớp cơ sở này thực hiện INotifyPropertyChanged Giao diện đơn giản hóa việc thực hiện thông báo thay đổi thuộc tính và cung cấp một số chức năng thiết thực khác.
Trình tổng hợp sự kiện: Ánh sáng Mvvm Cung cấp một trình tổng hợp sự kiện để liên lạc lỏng lẻo giữa các mô hình khung nhìn. Các mô hình xem có thể xuất bản các sự kiện và các mô hình xem khác có thể đăng ký và phản hồi các sự kiện này, đạt được cơ chế nhắn tin tách rời.
Thực hiện lệnh: Ánh sáng Mvvm cung cấp Lệnh chuyển tiếp lớp, đó là một triển khai chung Lệnh ICommand Lớp lệnh của giao diện. Bằng cách sử dụng Lệnh chuyển tiếp , nhà phát triển có thể dễ dàng xác định và thực thi các lệnh trong mô hình khung nhìn và liên kết chúng với khung nhìn.
Nhắn tin: Ánh sáng Mvvm Cung cấp cơ chế nhắn tin cho phép liên lạc tin nhắn đơn giản giữa các mô hình khung nhìn. Nhà phát triển có thể gửi tin nhắn và đăng ký tin nhắn để cho phép liên lạc và tương tác giữa các mô hình xem.
Định vị dịch vụ: Ánh sáng Mvvm Cung cấp một bộ định vị dịch vụ đơn giản để tách rời mô hình khung nhìn và triển khai dịch vụ cụ thể. Bằng cách sử dụng bộ định vị dịch vụ, mô hình khung nhìn có thể dễ dàng lấy được phiên bản dịch vụ được yêu cầu mà không cần trực tiếp khởi tạo lớp dịch vụ.
MvvmLight là một khung MVVM giàu tính năng và dễ sử dụng. Nó cung cấp nhiều công cụ và chức năng hữu ích để giúp các nhà phát triển triển khai mẫu MVVM dễ dàng hơn. Tiếp theo, chúng ta hãy thử áp dụng khung MvvmLight cho ví dụ của chúng ta ngày hôm qua.
Thêm gói NuGet của MvvmLight vào dự án để giới thiệu các thành phần và chức năng liên quan của khung MvvmLight. Chỉ cần cài đặt phiên bản tương ứng. Hãy chú ý để phân biệt xem dự án của bạn thuộc .Net Framework framework hay .Net Core:
Sau khi cài đặt, bạn có thể thấy cấu trúc của dự án sẽ thay đổi một chút. Nó sẽ tự động tạo một thư mục có tên ViewModel và các tệp MainViewModel.cs và ViewModelLocator.cs. Đồng thời, tệp App.xaml cũng sẽ thay đổi:
MainViewModel.cs - Kế thừa lớp ViewModelBase do khung MvvmLight cung cấp. Lớp ViewModelBase kế thừa lớp ObservableObject và triển khai giao diện ICleanup. Lớp ObservableObject triển khai giao diện INotifyPropertyChanged, được sử dụng để thông báo các thay đổi về thuộc tính. khi cần thiết.
ViewModelLocator.cs - Chỉ có một lớp ViewModelLocator trong tệp, bao gồm hàm tạo, thuộc tính Chính thuộc loại MainViewModel và hàm Dọn dẹp tĩnh. Trong hàm tạo, một phiên bản duy nhất của loại SimpleIoc được tạo để đăng ký MainViewModel, sau đó ServiceLocator được sử dụng để bao bọc phiên bản đơn này của loại SimpleIoc nhằm hỗ trợ quản lý thống nhất.
Thay đổi tệp App.xaml - Lớp ViewModelLocator được tạo từ điển tài nguyên và được thêm vào tài nguyên chung.
DataContext="{Liên kết chính, Nguồn={Trình định vị tài nguyên tĩnh}}"
Sau khi quá trình cài đặt hoàn tất, chúng tôi loại trừ các tệp chế độ MVVM mà chúng tôi đã tạo trước đó khỏi dự án và viết mã logic nghiệp vụ trước đó vào MainViewModel.cs được tạo:
ViewModel\MainViewModel.cs:
sử dụng GalaSoft.MvvmLight; sử dụng GalaSoft.MvvmLight.Command; sử dụng System.Windows; không gian tên WPFDemo.ViewModel { public class MainViewModel : ViewModelBase { public RelayCommand ShowInfoCommand { get; } public string _name; public string Name { get { return _name; } set { _name = value; RaisePropertyChanged(); } } public string _description; public string Description { get { return _description; } set { _description = value; RaisePropertyChanged(); } } public MainViewModel() { Name = "Không có gì"; Description = "Không có gì"; ShowInfoCommand = new RelayCommand(ShowInfo); } public void ShowInfo(object parameter) { Name = tham số dưới dạng chuỗi; Description = tham số dưới dạng chuỗi; MessageBox.Show(tham số là chuỗi); } } }
Cửa sổ chính.xaml:
Chạy chương trình:
Bộ công cụ cộng đồng.Mvvm
Giới thiệu bộ công cụ MVVM.
Gói CommunityToolkit.Mvvm (còn gọi là MVVM Toolkit, trước đây là Microsoft.Toolkit.Mvvm) là một thư viện MVVM mô-đun hiện đại, nhanh chóng và nhanh chóng.
Chương này kết thúc mà không có phiên bản .Net Framework. . .
Xong
Trong WPF, các lệnh là một cơ chế xử lý sự tương tác của người dùng. Nó tách các hành vi vận hành khỏi các thành phần giao diện, cho phép các thành phần giao diện được kích hoạt thông qua các lệnh và thực thi logic tương ứng. Mô hình lệnh trong WPF được triển khai thông qua giao diện ICommand và các lớp triển khai liên quan. Ý tưởng thiết kế của mẫu lệnh là tách riêng người gửi lệnh (chẳng hạn như nút) khỏi người thực thi lệnh (chẳng hạn như phương thức trong mô hình khung nhìn) để không có sự phụ thuộc trực tiếp giữa chúng, cải thiện khả năng bảo trì và tái sử dụng của mã.
MVVM (Model-View-ViewModel) là một mẫu kiến trúc phần mềm để xây dựng các ứng dụng WPF chia logic của ứng dụng thành ba phần cốt lõi: mô hình, khung nhìn và mô hình khung nhìn. Model đại diện cho mô hình dữ liệu, chịu trách nhiệm thu thập và xử lý dữ liệu; view đại diện cho giao diện người dùng, chịu trách nhiệm hiển thị giao diện; mô hình view là cầu nối giữa view và mô hình, chịu trách nhiệm xử lý logic nghiệp vụ, cung cấp dữ liệu. chức năng ràng buộc và ra lệnh. MVVM thực hiện giao tiếp giữa các khung nhìn và các mô hình khung nhìn thông qua các lệnh và liên kết dữ liệu, đồng thời tách biệt logic giao diện và logic nghiệp vụ, giúp mã rõ ràng hơn, có thể kiểm tra và bảo trì được.
Cuối cùng, bài viết về WPF Getting Started Notes-06-Commands kết thúc tại đây. Nếu bạn muốn biết thêm về WPF Getting Started Notes-06-Commands, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. trong tương lai blog của tôi! .
Có cách nào để lưu trữ cửa sổ WPF bên trong cửa sổ WPF khác không. Tôi có một vài bảng hơi phức tạp. Nhưng bây giờ để đơn giản hóa mọi thứ, tôi đang cố gắng kết hợp một số chúng thành các tab ở dạng "trang tổng quan". Lưu ý rằng tôi không cố gắng lưu trữ Windows Forms mà đúng hơn là
Những khía cạnh và thực tiễn cụ thể nào của WPF là hữu ích nhất (và không khó thực hiện) trong lập trình GUI không phải WPF? Câu trả lời hay nhất tôi đã học về các mẫu lệnh bằng cách học các lệnh WPF. Nó tạo thành cơ sở cho việc phân tách giao diện người dùng - mã mà tôi nghĩ nên có trong các ứng dụng khác
WinRT/Metro đang nhận được điều khiển SemanticZoom mới, nhưng tôi gặp khó khăn khi tìm bất kỳ thứ gì cho WPF. Tôi không muốn chuyển sang Metro cho dự án cụ thể của mình vì nó không cho phép tôi tạo các ứng dụng cửa sổ hoặc nhiều ứng dụng thời gian thực trên nhiều màn hình.
Tôi đang gặp khó khăn trong việc giải quyết vấn đề của mình và điều đó khiến tôi phát điên. Ý tưởng là thế này: Tôi có hai phần tử ListView và khi một phần tử rơi từ danh sách đầu tiên xuống danh sách thứ hai, tôi cần mở một hộp thoại, nhưng tôi cần thông tin về phần tử đã bị loại bỏ và những gì đã được thêm vào để điền vào Phần tử của cuộc hội thoại .
Nếu tôi làm theo TabControl và mọi thứ hoạt động tốt thì khi tôi chuyển sang Tabitem thứ hai, nó sẽ hiển thị mà không gặp vấn đề gì. //datagrid //datagrid2 Nhưng nếu tôi có xaml này, khi tôi
Trong ứng dụng Windows Forms, dataGridView của chúng tôi có nhiều sự kiện như nhấp đúp chuột vào hàng hoặc nhấp vào hàng, v.v... Nhưng trong WPF, tôi không thể tìm thấy những sự kiện này. Làm cách nào để thêm nhấp đúp chuột vào lưới chứa dữ liệu
Trong dự án này, mã biên dịch và thực thi chính xác; tuy nhiên, tôi cần trợ giúp về hai vấn đề: Trình thiết kế WPF VS2012 không hoạt động với tệp XAML này. Nó hiển thị thông báo Design View không khả dụng cho nền tảng đích x64 và ARM. tôi chấp nhận
Hiện tại tôi đang thiết kế WPF ScrollViewer và tôi đã tìm thấy Content="M 0 0 L 4 4 L 0 8 Z" khi đọc các ví dụ MSDN. Bây giờ tôi thực sự muốn biết điều này có nghĩa là gì nhưng tôi không thể.
Trong WPF, một phần tử có thể có khả năng hiển thị "hiển thị" nhưng thực tế không hiển thị trên màn hình vì phần tử cha của nó (hoặc phần tử cha của phần tử cha) đã thu gọn khả năng hiển thị. Tôi muốn biết liệu một phần tử có thực sự được hiển thị trên màn hình hay không mà không cần phải duyệt qua cây trực quan để kiểm tra phần tử gốc. có
Tôi có nên sử dụng ApplicationCommands.Close để đóng hộp thoại phương thức hay lệnh này được coi là dành riêng để đóng ứng dụng? Nếu sau này, vui lòng tạo hộp thoại Đóng cho mỗi lệnh hoặc chỉ Đóng
Có bất kỳ điều khiển piemenu nào có sẵn cho WPF không? Câu trả lời hay nhất tôi tìm thấy trong mục yêu thích của mình, bạn có thể xem thử: Chúc bạn một ngày tốt lành. Giới thiệu về wpf - Menu WPF, chúng tôi đã tìm thấy nó trên
Tôi đang cố gắng sử dụng WrapPanel và hai TextBlocks để thêm dấu hoa thị (*) vào bên trái của một số văn bản, cho phép văn bản được ngắt dòng và buộc văn bản được căn phải. Bằng cách tạo FlowDirection được đặt thành RightToL
Đây là kịch bản (được đơn giản hóa): Tôi có một điều khiển (giả sử là Hình chữ nhật) trên Cửa sổ. Tôi đã kết nối với sự kiện MouseMove để nó bắt đầu thao tác kéo và thả. Sau đó tạo hiệu ứng cho nó trong sự kiện MouseDown để di chuyển 50 pixel sang phải. Nhưng
Tôi có ListView có nguồn mục là danh sách. Tôi muốn người dùng chỉ chọn một mục. Khi tôi đặt SelectionMode của chế độ xem danh sách thành một mục, người dùng vẫn có thể chọn nhiều mục và có vẻ như
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc kiến thức chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập trang
Mục đích của INotifyPropertyChanged là gì. Tôi biết sự kiện này được kích hoạt bất cứ khi nào một thuộc tính được thay đổi, nhưng làm thế nào Chế độ xem/Giao diện người dùng biết rằng sự kiện này được kích hoạt: Đây là cách triển khai INotifyPropertyChang
Tôi đang xem các thành phần WPF trong hộp công cụ và không thể tìm thấy nhà cung cấp lỗi tồn tại trong năm 2005/2008. Nó đã được gỡ bỏ? Câu trả lời hay nhất ErrorProvider là điều khiển Winforms. Không có tương đương trong WPF. Nhưng
Tôi đang cố gắng thực hiện hành vi khác khi nhấp và nhấp đúp vào điều khiển Hình ảnh wpf. Thật không may, nhấp chuột được kích hoạt trước tiên nên nhấp đúp sẽ bị bỏ qua. Câu trả lời hay nhất Nếu bạn sử dụng sự kiện MouseDown thay vào đó là ClickCo trong EventArgs
Điều này có thể thực hiện được không? Tôi đã sử dụng điều khiển khung và :show (ví dụ: showwindow.xaml) nhưng tôi gặp lỗi này: phần tử gốc không hợp lệ để điều hướng Câu trả lời hay nhất thực sự là
Tôi có một bộ mở rộng được đặt trên một cửa sổ có nền màu xanh lam và tôi muốn nút của bộ mở rộng có màu khác với màu mặc định (màu xanh lam, được nhận từ cửa sổ). Khi tôi sửa đổi thuộc tính nền của thiết bị mở rộng, nó sẽ thay đổi toàn bộ thiết bị mở rộng, tiêu đề và tất cả thành màu mới. Tuy nhiên, tôi chỉ muốn thay đổi nút đó. Ai có thể chỉ
Tôi là một lập trình viên xuất sắc, rất giỏi!