Tôi phát triển ứng dụng WPF bằng MVVM và tôi đang học cách làm mọi thứ tốt nhất.
Tôi có một biểu mẫu WPF với các bộ chọn, hai danh sách với các trường tìm kiếm và một số yếu tố khác. Hiện tại tất cả chỉ ở một dạng và nó hoạt động. Nhưng đến bây giờ VM cho hình thức đó có hơn 800 dòng và nó vẫn chưa hoàn thành.
Tôi muốn cấu trúc biểu mẫu này và mã tốt hơn. Tôi nghĩ về các vùng, tệp với các lớp một phần và điều khiển người dùng. Tôi nghĩ rằng điều khiển người dùng sẽ là tốt nhất bởi vì họ gói gọn một vài điều khiển và logic. Nếu tôi sử dụng các điều khiển của người dùng thì số lượng mã trong cửa sổ đó và VM sẽ giảm đáng kể.
Để làm điều này đúng, tôi làm việc thông qua cuốn sách "Pro WPF 4.5 In C # 4th Edition", Chương 18 - Các yếu tố tùy chỉnh và mẫu ColorPickerUserControl. Mẫu này là về một bộ chọn màu với ba thanh trượt và nó có 150 dòng mã.
Tôi nghĩ rằng tôi hiểu cách thức hoạt động của nó nhưng đối với tôi, việc tạo ra các điều khiển người dùng, ngay cả với chức năng rất hạn chế như trong mẫu đó, là rất nhiều công việc . Nếu tôi sử dụng các điều khiển này nhiều lần thì tôi hiểu sẽ hợp lý khi làm điều này. Nhưng nếu tôi chỉ sử dụng các điều khiển một lần và tôi chỉ làm điều này để cấu trúc biểu mẫu của mình thì đây có vẻ là rất nhiều công việc để kiếm được ít tiền.
Câu hỏi của tôi là: Có nên sử dụng các điều khiển người dùng để cấu trúc các biểu mẫu ngay cả khi các điều khiển người dùng này chỉ được sử dụng một lần không? Nếu không, có một sự thay thế tốt hơn?
Chỉnh sửa (không cần đọc, chỉ cần thêm thông tin): Cho đến bây giờ tôi không viết bất kỳ chi tiết nào vì tôi muốn tìm hiểu về nguyên tắc nhưng sau khi đọc câu trả lời thú vị của 17, 26, đây là một số chi tiết: Hình thức này là chọn tiêu đề nhạc.
Nhóm A: (có thể kiểm soát người dùng A) là về loại lựa chọn như chọn theo nghệ sĩ hoặc album, có hoặc không có video, có thể năm xuất bản, v.v.
Nhóm B: Danh sách này chứa tên nghệ sĩ được lọc theo tiêu chí trong A. Người dùng có thể lọc danh sách tức là chỉ hiển thị tên nghệ sĩ có chứa "top".
Nhóm C: Danh sách này hiển thị các tiêu đề từ nghệ sĩ được chọn trong B cũng sử dụng tiêu chí từ A (tức là âm thanh hoặc video). Nó có thể được lọc tương tự như B tức là chỉ các tiêu đề có chứa "bạn".
Hầu hết logic xảy ra trong VM (DataContext của biểu mẫu). Các danh sách từ A và B đến từ cơ sở dữ liệu. Các danh sách được lọc và chuẩn bị để trình bày (tức là nhiều tiêu đề có cùng tên nhưng trong các album khác nhau). Người dùng chọn một tiêu đề trong Danh sách C bằng cách nhấp đúp hoặc sử dụng kéo và thả vào một biểu mẫu WPF khác.
Những gì tôi muốn: Tôi muốn mã có thể đọc được để tôi có thể dễ dàng sửa đổi nó. Nếu tôi muốn thêm tức là một bộ lọc khác, hãy nói rằng chỉ hiển thị các nghệ sĩ nữ thì sẽ tốt hơn nếu tôi có thể đi đến kiểm soát người dùng A và thêm các hộp kiểm cho các nghệ sĩ nam và / hoặc nữ.
XAML ở dạng hiện tại không có vấn đề gì, nó có cấu trúc tốt. Nhưng VM có mã cho tất cả các bên trên. Một số thứ nằm trong hàm tạo, một số trong phần lệnh, một số thuộc tính và các trường sao lưu. Tôi vẫn có thể tìm thấy mọi thứ bây giờ nhưng tôi nghĩ sẽ tốt hơn nếu mã sẽ có cấu trúc hơn. Đây là lý do tại sao tôi nghĩ về Kiểm soát người dùng.
Tôi cố gắng theo dõi MVVM bởi vì tôi nghĩ logic đằng sau nó có rất nhiều ý nghĩa. Nhưng tôi không phải là tín đồ cuồng nhiệt của bất kỳ thực hành lý thuyết nào. Tức là nếu tôi có thể làm gì đó trong 5 dòng CodeBehind hoặc trong 50 dòng trong VM tôi sẽ làm điều đó trong CodeBehind. Câu hỏi của tôi là về nguyên tắc làm thế nào để tạo các biểu mẫu có cấu trúc trong WPF. Biểu mẫu tôi mô tả ở trên là một ví dụ hay nhưng câu trả lời không nên tập trung vào một từ này mà là ý tưởng làm thế nào để cấu trúc các biểu mẫu WPF tức là có (hoặc không có) điều khiển người dùng.
Về lý do tại sao tôi nghĩ rằng các điều khiển của người dùng là rất nhiều công việc: Chúng có các thuộc tính phụ thuộc, các sự kiện được định tuyến, v.v ... Tất cả điều này đối với tôi phức tạp hơn nhiều so với các thuộc tính của Bình thường với các trường sao lưu và INotify. Nhưng có lẽ tôi chỉ phải làm quen với các thuộc tính phụ thuộc, các sự kiện được định tuyến, v.v.
<UserControl>
</UserControl>
. Đó là nó.