Jak powiązać widoczność przycisku z wartością bool w moim ViewModel?
<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}"
Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand"
Visibility="{Binding Path=AdvancedFormat}" />
c#
wpf
xaml
data-binding
raym0nd
źródło
źródło
Odpowiedzi:
Zakładając, że
AdvancedFormat
jestbool
, musisz zadeklarować i użyćBooleanToVisibilityConverter
:Zwróć uwagę na dodane
Converter={StaticResource BoolToVis}
.Jest to bardzo powszechny wzorzec podczas pracy z MVVM. Teoretycznie można zrobić konwersję siebie na własność ViewModel (czyli po prostu zrobić właściwość samego typu
Visibility
), chociaż ja nie preferuje tego robić, ponieważ teraz są brudząc z separacji obawy. Widoczność elementu powinna naprawdę zależeć od widoku.źródło
Istnieje trzeci sposób, który nie wymaga konwertera ani zmiany modelu widoku: użyj stylu:
Preferuję tę technikę, ponieważ używam jej w wielu przypadkach, w których to, co wiążę, nie jest logiczne - np. Wyświetlanie elementu tylko wtedy, gdy
DataContext
nie jest null, lub implementowanie wyświetlaczy wielostanowych, w których pojawiają się różne układy w oparciu o ustawienie wyliczenia w modelu widoku.źródło
TextBlock
któremuTextWrapping="Wrap"
dano. Teraz ta właściwość zawijania nie jest w nim ustawiona.Dwukierunkowa konwersja w języku C # z wartości logicznej na widoczność
źródło
Ogólnie rzecz biorąc, można to zrobić na dwa sposoby, za pomocą klasy konwertera lub właściwości w modelu Viewmodel, która zasadniczo konwertuje wartość za Ciebie.
Zwykle stosuję podejście dotyczące własności, jeśli jest to jednorazowa konwersja. Jeśli chcesz go ponownie użyć, użyj konwertera. Poniżej przykład konwertera:
Metoda właściwości ViewModel po prostu sprawdzałaby wartość właściwości logicznej i na jej podstawie zwracałaby widoczność. Pamiętaj, aby zaimplementować INotifyPropertyChanged i wywołać ją we właściwościach Boolean i Visibility, aby poprawnie zaktualizować.
źródło
Można to osiągnąć w bardzo prosty sposób 1. Zapisz to w widoku.
Poniżej znajduje się właściwość logiczna, która przechowuje wartość prawda / fałsz. Poniżej znajduje się fragment kodu. W moim przykładzie ta właściwość jest w klasie UserNote.
W ten sposób właściwość IsHide pobiera wartość.
źródło
Z uwagi:
W widoku Model:
Będziesz musiał mieć wydarzenie zmiany właściwości
W ten sposób używają modelu widoku modelu
Ale ponieważ chcesz, aby był powiązany z wartością logiczną, będziesz potrzebować konwertera. Innym sposobem jest ustawienie wartości boolowskiej na zewnątrz i po kliknięciu tego przycisku ustaw właściwość property_advancedFormat na żądaną widoczność.
źródło
private Visibility _advancedFormat = Visibility.visible
To działa dobrze naUWP
dzięki.Od Windows 10 15063 wzwyż
Od wersji 15063 systemu Windows 10 dostępna jest nowa funkcja o nazwie „Niejawna konwersja widoczności”, która natywnie wiąże widoczność z wartością bool - nie ma już potrzeby korzystania z konwertera.
(patrz https://social.technet.microsoft.com/wiki/contents/articles/34846.uwp-compiled-binding-windows-10-anniversary-update.aspx#Implicit_Visibility_conversion ).
Mój kod (który zakłada, że używany jest MVVM, a także szablon 10):
źródło