2008-12-01 12 views
8

Pracuję nad aplikacją Windows Forms już od jakiegoś czasu i naprawdę robię więcej kodów typograficznych w kodzie GUI niż w moim podstawowym kodzie biznesowym.Silnie wpisane formanty w .NET

To, co mam na myśli, stanie się oczywiste, jeśli obejrzysz kontrolkę ComboBox, która akceptuje jakiś niejasny "obiekt" jako przedmiot. Następnie wyłączysz i możesz wyświetlić DisplayMember i ValueMember i tak dalej.

Jeśli chcę odzyskać tę wartość później, muszę odcyfrować mój obiekt z powrotem do tego, co to było. Podobnie jak struny coraz wartość bierze

string value = (string)combobox1.SelectedItem; 

Ponieważ istnieją rodzajowych w ramowych od dłuższego czasu, ja wciąż zastanawiam się, dlaczego do cholery nie jedna kontrola ze standardowego zestawu narzędzi jest nazwą rodzajową.

Też znajduję się przy użyciu właściwości .Tag na ListViewItems cały czas, aby zachować wyświetlany obiekt domeny. Ale za każdym razem, gdy potrzebuję uzyskać dostęp do tego obiektu, potrzebuję następnej typecast.

Dlaczego nie mogę po prostu stworzyć ComboBox lub ListView z elementów typu ListViewItem

jestem brakuje czegoś tutaj lub jest to po prostu kolejny przykład nie doskonale przemyślane kontroli?

Odpowiedz

3

Chociaż krytyka "nie używała generycznych" nie może być rzetelnie zastosowana do formantów opracowanych przed ich istnieniem ... należy zastanawiać się nad kontrolkami WPF (nowość w .NET 3.0, po generycznych w .NET 2.0) .

Sprawdziłem metodę AddChild w ComboBox. Pobiera parametr obiektu (ugh).

Kontrola ta ma być używana głównie przez XAML. Czy zostało to zrobione w ten sposób, ponieważ nie ma możliwości określenia parametru typu w XAML? (na marginesie: czy nie ma możliwości określenia parametru typu w XAML?)

Niestety, nie mamy ostatecznej odpowiedzi "dlaczego", po prostu dzielimy się wspólną nędzą konieczności rzucania podczas pracy z interfejsem użytkownika.

1

Nie sądzę, że czegoś brakuje. Po prostu te klasy zostały stworzone w czasach pre-Generics, a WinForms nie jest po prostu wystarczająco zaawansowanym narzędziem, aby MS mógł spędzać dużo czasu na zmianie lub rozszerzeniu API.

1

Często tworzę klasy opakowania dla elementów sterujących. To pozwala mi używać generycznych. Często wiąże się to z Reflection, który nie jest bezpieczny podczas kompilacji, ale może być w czasie wykonywania.

1

Powszechnym źródłem tego problemu, jak sądzę, nie jest oddzielenie logiki widoku/prezentacji od logiki modelu danych w pamięci. Które, niestety, jest błąd architektury, że WinForms i projektant GUI Visual Studio są włączone w.

WinForms i projektant VS nie zachęcają programistę do oddzielenia zarządzania swoimi obiektami danych od samych klas formularzy. Prawdopodobnie byłoby lepiej, gdyby obiekty ComboBox ListViewItem nie oferowały żadnej pomocy dla dowolnych obiektów, albo za pośrednictwem generycznych, albo kolekcji obiektów.

Jeśli nie hakujesz razem czegoś o ograniczonym użyciu i życiu, powinieneś unikać przechowywania odniesienia do poszczególnych obiektów danych bezpośrednio w twoich kontrolkach lub formularzach.Powinny być zarządzane osobno, a jeśli trzeba się do nich odwoływać, należy to zrobić za pomocą klasy zarządzania modelem zaprojektowanej dla określonego typu widoku, z którym pracujesz.

Prosty bandaż dla problemu może polegać na "mapowaniu" reprezentacji tekstowych umieszczanych w ComboBox lub ListView na oryginalnych obiektach, przy użyciu elementu pola Dictionary w klasie Form. Nie jest to idealne rozwiązanie, ale zapewnia co najmniej pół kroku między danymi a kontrolkami interfejsu użytkownika, co może ułatwić utrzymanie kodu.

Edit: ta jest wprawdzie oddzielić od klasy ListViewItemCollection narażając instancji obiektów ... Oficjalna obrona jest prawdopodobne, że chcieli obsługiwać standardowe interfejsy IEnumerable i ICollection. Ale nie ma powodu, dla którego nie mogliby również zapewnić nadpisań tych metod specyficznych dla typu, ponieważ zaprojektowano jawnie do przechowywania instancji ListViewItem. Więc nie mam dla ciebie odpowiedzi na to konkretne pytanie.

1

Cóż, jeśli wiążesz dane ze swoimi kontrolkami z DataBindingSource, możesz uzyskać dane w ten sposób, ale AFAIK, który nadal nie jest silnie wpisany. Jeśli wyświetlasz wiele parametrów/aspektów pojedynczego obiektu biznesowego, możesz go powiązać, a następnie uzyskać dostęp do (mocno wpisanych) członków - oczywiście wszystko to wraca do odpowiedzi Turbulent Intellect, która jest lepszą separacją między modelem i widok. Mimo to, zgadzam się, że pomocne byłoby pisanie na podstawie generycznych.

1

Jest to możliwe (można utworzyć własne ogólne sterowanie, jeśli chcesz), ale projektant formularzy dostarczany z programem Visual Studio może w tym przypadku odstraszać. Będziesz musiał robić rzeczy bez tego.

Nie jesteś pierwszym, który o tym myśli, a firma Microsoft otrzymała już za to sporo krytyki ze strony opinii publicznej. Miejmy nadzieję, że dodadzą wsparcie dla tego w przyszłości.

Powiązane problemy