2008-12-01 38 views
8

Tôi đang làm việc trên ứng dụng Windows Forms trong một thời gian ngắn và tôi thực sự thấy mình đang thực hiện nhiều dự đoán hơn trong mã GUI so với mã kinh doanh cơ bản của mình.Điều khiển được đánh mạnh mẽ trong .NET

Điều tôi ngụ ý trở nên rõ ràng nếu bạn xem điều khiển ComboBox chấp nhận một số "đối tượng" mơ hồ như mục đó. Sau đó, bạn tắt và có thể hiển thị một số DisplayMember và một ValueMember và như vậy.

Nếu tôi muốn lấy lại giá trị đó sau này, tôi cần phải định kiểu lại đối tượng của mình về nó. Giống như với chuỗi nhận được giá trị mất

string value = (string)combobox1.SelectedItem; 

Vì có Generics trong khuôn khổ một thời gian khá bây giờ, tôi vẫn tự hỏi tại sao trong địa ngục không phải là một điều khiển từ hộp công cụ tiêu chuẩn là chung chung.

Tôi cũng thấy bản thân mình sử dụng thuộc tính .Tag trên ListViewItems mọi lúc để giữ đối tượng miền được hiển thị. Nhưng mỗi khi tôi cần truy cập vào đối tượng đó thì tôi cần một kiểu chữ khác.

Tại sao không thể tôi chỉ cần tạo một ComboBox hoặc ListView với mục loại ListViewItem

Tôi có thiếu một cái gì đó ở đây hay là này chỉ là một ví dụ về không hoàn hảo cũng nghĩ thông qua kiểm soát?

Trả lời

3

Trong khi những lời chỉ trích "không sử dụng Generics" không thể áp dụng một cách công bằng cho các điều khiển được phát triển trước khi chúng tồn tại ... người ta phải tự hỏi về điều khiển WPF (mới trong .NET 3.0, sau khi Generics trong .NET 2.0) .

Tôi đã kiểm tra phương thức AddChild trong ComboBox. Phải mất một tham số đối tượng (ugh).

Điều khiển này được dự định sẽ được sử dụng chủ yếu thông qua XAML. Điều này đã được thực hiện theo cách này bởi vì không có cách nào để chỉ định một tham số kiểu trong XAML? (sang một bên, không có cách nào để chỉ định một tham số kiểu trong XAML?)

Xin lỗi vì không có câu trả lời "Tại sao" dứt khoát, chỉ cần chia sẻ sự khốn khổ chung cần thiết khi làm việc với giao diện người dùng.

1

Tôi không nghĩ bạn đang thiếu gì cả. Nó chỉ là các lớp này được tạo ra trong các ngày trước Generics, và WinForms đơn giản là không cắt cạnh đủ cho MS để dành nhiều thời gian thay đổi hoặc mở rộng API.

1

Tôi thường tạo các lớp trình bao bọc cho các điều khiển. Điều này cho phép tôi sử dụng Generics. Điều này thường kết hợp với Reflection, mà không phải là loại an toàn tại thời gian biên dịch, nhưng có thể ở thời gian chạy.

1

Một nguồn chung của vấn đề này, tôi nghĩ, không tách logic xem/trình bày của bạn khỏi logic mô hình dữ liệu trong bộ nhớ của bạn. Mà, thật không may, là một lỗi kiến ​​trúc mà WinForms và Visual Studio GUI thiết kế là đồng lõa.

WinForms và VS designer không khuyến khích lập trình viên tách riêng việc quản lý các đối tượng dữ liệu của họ khỏi các lớp biểu mẫu. Nó có lẽ sẽ tốt hơn nếu các đối tượng ComboBox ListViewItem không cung cấp bất kỳ sự hỗ trợ nào cho các đối tượng tùy ý, hoặc thông qua các bộ sưu tập Generics hoặc Object ..

Trừ khi bạn đang sử dụng cùng một số hạn chế và tuổi thọ, bạn nên tránh lưu trữ tham chiếu đến các đối tượng dữ liệu riêng lẻ ngay trong các điều khiển hoặc biểu mẫu của bạn.Chúng cần được quản lý riêng biệt và nếu chúng cần được tham chiếu, nó phải được thực hiện thông qua một lớp quản lý mô hình được thiết kế cho loại lớp xem cụ thể mà bạn đang làm việc.

Băng đơn giản cho vấn đề, có thể là "ánh xạ" các biểu diễn văn bản mà bạn đặt vào ComboBox hoặc ListView vào đối tượng gốc, sử dụng thành viên trường Từ điển trên lớp Biểu mẫu của bạn. Nó không phải là một giải pháp lý tưởng, nhưng cung cấp cho bạn ít nhất một nửa bước gián đoạn giữa dữ liệu của bạn và các điều khiển giao diện người dùng của bạn, điều này có thể làm cho mã của bạn dễ bảo trì hơn.

Chỉnh sửa: Điều này được thừa nhận là tách biệt khỏi lớp ListViewItemCollection hiển thị đối tượng Object ... Bảo vệ chính thức có khả năng là chúng muốn hỗ trợ giao diện ICnection và ICollection tiêu chuẩn. Nhưng không có lý do gì mà họ không thể cung cấp phần ghi đè cụ thể kiểu của các phương thức này, vì nó được thiết kế rõ ràng để lưu trữ các thể hiện ListViewItem. Vì vậy, tôi không có câu trả lời cho bạn về câu hỏi cụ thể đó.

1

Vâng, nếu bạn kết nối dữ liệu các điều khiển của mình với một DataBindingSource, bạn có thể lấy dữ liệu theo cách đó, nhưng AFAIK vẫn chưa được gõ mạnh. Nếu bạn đang hiển thị nhiều tham số/khía cạnh của một đối tượng kinh doanh, bạn có thể liên kết với nó, sau đó truy cập vào các thành viên (được đánh máy mạnh) thay vào đó - tất nhiên, điều này quay trở lại câu trả lời của Turbulent Intellect. lượt xem. Tuy nhiên, tôi đồng ý rằng kiểu gõ chung sẽ giúp ích cho bạn.

1

Có thể (bạn có thể thực hiện các điều khiển chung của riêng mình, nếu bạn muốn), nhưng trình thiết kế biểu mẫu đi kèm với Visual Studio sẽ không hoạt động nếu bạn làm điều này. Bạn sẽ phải làm những thứ mà không có nó.

Bạn không phải là người đầu tiên nghĩ về điều này, và Microsoft đã nhận được một phần công bằng những lời chỉ trích từ công chúng về điều này. Hãy hy vọng họ thêm hỗ trợ cho điều này trong tương lai.

Các vấn đề liên quan