W aplikacji WPF, w aplikacji MVP, mam pole kombi, dla którego wyświetlam dane pobrane z Bazy Danych. Przed elementami dodanymi do pola Combo chcę wyświetlić domyślny tekst, taki jak
" -- Wybierz drużynę --"
aby po załadowaniu strony wyświetlił się i po wybraniu go tekst powinien zostać wyczyszczony, a pozycje powinny zostać wyświetlone.
Trwa wybieranie danych z DB. Muszę wyświetlać domyślny tekst, dopóki użytkownik nie wybierze elementu z pola kombi.
Proszę, prowadź mnie
Focusable="False" IsEditable="True" IsReadOnly="True"
Możesz to zrobić bez żadnego kodu, używając pliku
IValueConverter
.Tutaj masz klasę konwertera, której możesz ponownie użyć.
Na koniec musisz zadeklarować swój konwerter w sekcji zasobów.
Gdzie Converters to miejsce, w którym umieściłeś klasę konwertera. Oto przykład:
Bardzo fajną rzeczą w tym podejściu jest brak powtarzania kodu w kodzie.
źródło
DataTrigger
aby uniknąć tutaj nawet kodu konwertera :)Podoba mi się odpowiedź Tri Q, ale te konwertery wartości są trudne w użyciu. PaulB zrobił to za pomocą programu obsługi zdarzeń, ale to też jest niepotrzebne. Oto rozwiązanie w czystym języku XAML:
źródło
Nikt nie powiedział, że czyste rozwiązanie XAML musi być skomplikowane. Oto prosty, z jednym wyzwalaczem danych w polu tekstowym. Margines i pozycja według potrzeb
źródło
<Setter Property="Visibility" Value="Hidden"/>
poza wyzwalaczem (wewnątrz stylu) i usunięcieVisibility="Hidden"
z rzeczywistego elementu textblockUstaw
IsEditable="True"
naComboBox
elemencie. Spowoduje to wyświetlenieText
właściwości plikuComboBox
.źródło
Nie wiem, czy jest bezpośrednio obsługiwany, ale możesz nałożyć na kombinację etykietę i ustawić ją jako ukrytą, jeśli wybór nie jest pusty.
na przykład.
Następnie w wyborze zmieniono obsługę ...
źródło
Na podstawie odpowiedzi IceForge przygotowałem rozwiązanie wielokrotnego użytku:
styl XAML:
przykład użycia:
źródło
Nie próbowałem tego z polami kombi, ale zadziałało to dla mnie z innymi kontrolkami ...
post na blogu ageektrapped
Używa tutaj warstwy adorner, aby wyświetlić znak wodny.
źródło
Rozwiązanie HappyNomad było bardzo dobre i pomogło mi ostatecznie dojść do tego nieco innego rozwiązania.
źródło
Najłatwiejszym sposobem jest użycie CompositeCollection do scalenia domyślnego tekstu i danych z bazy danych bezpośrednio w ComboBox np
W Resources zdefiniuj StaticResource, aby powiązać opcje ComboBox z DataContext, ponieważ bezpośrednie powiązanie w CollectionContainer nie działa poprawnie.
W ten sposób możesz zdefiniować opcje ComboBox tylko w XAML np
źródło
Polecam:
Zdefiniuj zachowanie
Użytkownik zachowanie
źródło
Odpowiedź IceForge była dość bliska i jest AFAIK najłatwiejszym rozwiązaniem tego problemu. Ale coś przeoczyło, ponieważ nie działało (przynajmniej dla mnie, tak naprawdę nigdy nie wyświetla tekstu).
Ostatecznie nie możesz po prostu ustawić właściwości „Widoczność” TextBlock na „Ukryty”, aby była ona ukryta, gdy element zaznaczony w polu kombi nie jest pusty; musisz ustawić to w ten sposób domyślnie (ponieważ nie możesz sprawdzić wartości Null w wyzwalaczach , używając Setter w XAML w tym samym miejscu co wyzwalacze.
Oto rzeczywiste rozwiązanie oparte na jego, brakujący seter jest umieszczony tuż przed wyzwalaczami:
źródło
EDYCJA: Zgodnie z poniższymi komentarzami, to nie jest rozwiązanie. Nie wiem, jak to działa, i nie mogę sprawdzić tego projektu.
Czas zaktualizować tę odpowiedź, aby uzyskać najnowszy kod XAML.
Znajdując to pytanie SO, szukając rozwiązania tego pytania, stwierdziłem, że zaktualizowana specyfikacja XAML ma proste rozwiązanie.
Do wykonania tego zadania jest teraz dostępny atrybut o nazwie „Symbol zastępczy”. To jest tak proste, jak to (w programie Visual Studio 2015):
źródło
PlaceholderText
wSystem.Windows.ComboBox
klasie nie ma nieruchomości . To jest pytanie dotyczące WPF, a nie WinForms.Nie jest to najlepsza praktyka, ale działa dobrze ...
Kod za
źródło
Uważam, że znak wodny, o którym wspomniano w tym poście, działałby dobrze w tym przypadku
Potrzebny jest trochę kodu, ale możesz go ponownie użyć dla dowolnego pola wielofunkcyjnego lub pola tekstowego (a nawet skrzynek z hasłami), więc wolę ten sposób
źródło
Używam klasy IsNullConverter w moim projekcie i zadziałało dla mnie. oto kod w języku c #, utwórz folder o nazwie Converter i dodaj tę klasę do tego folderu, ponieważ używany wyzwalacz nie obsługuje wartości for zamiast null, a IsNullConverter po prostu to robi
dodaj przestrzeń nazw w pliku XAML w ten sposób.
znaczy
użyj tej linii poniżej zasobów, aby była dostępna za pośrednictwem kodu XAML
tutaj jest kod XAML, użyłem tutaj wyzwalacza, więc za każdym razem, gdy element zostanie wybrany w polu kombi, widoczność tekstu staje się fałszywa.
źródło
// Kod XAML
// Kod ViewModel
źródło
Trochę późno, ale ...
Prostszym sposobem byłoby dodanie fikcyjnego elementu danych do listy z parametrem IsDummy = true i upewnienie się, że nie jest to HitTestVisable, a jego wysokość wynosi 1 piksel (przy użyciu konwertera), aby nie był widoczny.
Następnie wystarczy zarejestrować się w SelectionChanged i ustawić w nim indeks na fikcyjny indeks pozycji.
Działa jak urok i w ten sposób nie będziesz mieszać ze stylem i kolorami ComboBox lub motywem aplikacji.
źródło
Powyższy kod demonstruje najprostszy sposób osiągnięcia tego celu. Po załadowaniu okna zadeklaruj tekst pola kombi, używając właściwości .Text pola kombi. Można to rozszerzyć na DatePicker, Textbox i inne kontrolki.
źródło
Zrobiłem to przed powiązaniem combobox z danymi z bazy danych w za kodem w ten sposób -
źródło
Umieść etykietę na górze pudełka wielofunkcyjnego.
Powiąż zawartość etykiety z właściwością tekstu combobox.
Ustaw krycie combobox na zero, Opacity = 0.
Wpisz tekst domyślny we właściwości Text combobox
źródło
Ustaw tylko atrybut IsEditable na true
źródło
Wiem, że to jest na wpół stare, ale co z tego:
źródło
ComboBox
nie maEmptySelectionBoxTemplate
własności.