Używam BooleanToVisibilityConverter
w WPF do powiązania Visibility
właściwości formantu z plikiem Boolean
. Działa to dobrze, ale chciałbym, aby jedna z kontrolek ukryła się, jeśli wartość logiczna jest true
, i pokazała, czy tak jest false
.
.net
wpf
binding
visibility
Ruben Bartelink
źródło
źródło
Odpowiedzi:
Zaimplementuj własną implementację IValueConverter. Przykładowa implementacja znajduje się pod adresem
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
W swojej metodzie Convert, niech zwraca wartości, które chcesz, zamiast wartości domyślnych.
źródło
Zamiast odwracania, możesz osiągnąć ten sam cel, używając ogólnej
IValueConverter
implementacji, która może konwertować wartość logiczną na konfigurowalne wartości docelowe dla prawdy i fałszu. Poniżej jedna taka implementacja:Następnie podklasuj go, gdzie
T
jestVisibility
:Na koniec w ten sposób można użyć
BooleanToVisibilityConverter
powyższego w XAML i skonfigurować go, na przykład, do używaniaCollapsed
dla true iVisible
for false:Ta inwersja jest przydatna, gdy chcesz powiązać z właściwością logiczną o nazwie
IsHidden
przeciwieństwoIsVisible
.źródło
Visibility
właściwości w modelu widoku.a następnie przekaż wartość true lub false jako parametr ConverterParameter
źródło
else if (value is bool?)
strony ReSharper mówi mi: „Wyrażenie jest zawsze fałszywe”. Ponadto,if (flag)
część może być zapisane jako bardziej zwięźlereturn flag ? Visibility.Visible : Visibility.Collapsed;
.var nullable = (bool?)value; flag = nullable.GetValueOrDefault();
można uczynić znacznie krótszym i prostszym:flag = (bool?)value ?? false;
Napisz własne to na razie najlepsze rozwiązanie. Oto przykład konwertera, który może działać zarówno w trybie normalnym, jak i odwróconym. Jeśli masz z tym jakieś problemy, po prostu zapytaj.
źródło
BooleanToVisibilityConverter
, sprawdzając parametr na null:Parameter direction = Parameter.Normal; if (parameter != null) direction = (Parameter)Enum.Parse(typeof(Parameter), (string)parameter);
Istnieje również projekt konwerterów WPF w Codeplex. W swojej dokumentacji mówią, że możesz użyć ich MapConverter do konwersji z wyliczenia Visibility do bool
źródło
Jeszcze jeden sposób powiązania wartości logicznej ViewModel (IsButtonVisible) z właściwością widoczności kontrolki XAML. Bez kodowania, bez konwersji, tylko stylizacja.
źródło
Albo prawdziwie leniwy mężczyzna, po prostu skorzystaj z tego, co już jest i odwróć to:
źródło
Jeśli nie lubisz pisać niestandardowego konwertera, możesz użyć wyzwalaczy danych, aby rozwiązać ten problem:
źródło
Właśnie napisałem o tym post. Wykorzystałem podobny pomysł, co Michael Hohlios. Tylko użyłem Właściwości zamiast „parametru obiektu”.
Widoczność powiązania z wartością bool w WPF
Using Properties sprawia, że moim zdaniem jest bardziej czytelny.
źródło
Oto jeden, który napisałem i często używam. Używa boolowskiego parametru konwertera, który wskazuje, czy należy odwrócić wartość, a następnie używa XOR do wykonania negacji:
Oto tabela prawdy XOR w celach informacyjnych:
źródło
Szukałem bardziej ogólnej odpowiedzi, ale nie mogłem jej znaleźć. Napisałem konwerter, który może pomóc innym.
Opiera się na fakcie, że musimy wyróżnić sześć różnych przypadków:
Oto moja implementacja dla pierwszych 4 przypadków:
przykład:
Myślę, że parametry są łatwe do zapamiętania.
Mam nadzieję, że to komuś pomoże.
źródło
Możesz użyć programu QuickConverter .
Dzięki QuickConverter możesz napisać logikę konwertera w linii z BindingExpression
Oto odwrócony konwerter BooleanToVisibility:
Możesz dodać QuickConverter za pośrednictwem NuGet. Zapoznaj się z dokumentacją dotyczącą instalacji. Link: https://quickconverter.codeplex.com/
źródło
Napisz własną konwersję.
źródło
Prosta wersja jednokierunkowa, której można użyć w następujący sposób:
można zaimplementować w następujący sposób:
źródło
Konwertuj wszystko na wszystko (bool, string, enum itp.):
Przykłady XAML:
źródło
Zamiast pisać własny kod / wymyślać na nowo, rozważ użycie CalcBinding :
CalcBinding jest również bardzo przydatne w wielu innych scenariuszach.
źródło
Wiem, że to jest przestarzałe, ale nie musisz niczego ponownie wdrażać.
To, co zrobiłem, to zanegowanie wartości nieruchomości w następujący sposób:
....
I działa dobrze!
Czy coś mi brakuje?
źródło