Mam obiekt, który ma IsReadOnly
właściwość. Jeśli ta właściwość jest prawdziwa, chciałbym ustawić IsEnabled
właściwość przycisku (na przykład) na false.
Chciałbym wierzyć, że mogę to zrobić tak łatwo, IsEnabled="{Binding Path=!IsReadOnly}"
ale to nie działa z WPF.
Czy jestem zmuszony przejść przez wszystkie ustawienia stylu? Wydaje się po prostu zbyt pracowity dla czegoś tak prostego, jak ustawienie jednego bool na odwrotność innego bool.
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
Odpowiedzi:
Możesz użyć ValueConverter, który odwraca dla ciebie właściwość bool.
XAML:
Przetwornik:
źródło
!
tym, to jest trochę skomplikowany kod ... Ludzie wkładają wiele wysiłku, aby oddzielić to, co uważają za „kod” od tych biednych projektantów. Dodatkowe bolesne, gdy jestem zarówno programistą, jak i projektantem.Czy rozważałeś
IsNotReadOnly
nieruchomość? Jeśli powiązanym obiektem jest ViewModel w domenie MVVM, wówczas dodatkowa właściwość ma idealny sens. Jeśli jest to bezpośredni model encji, możesz rozważyć kompozycję i zaprezentowanie w formularzu specjalistycznego modelu ViewModel swojej encji.źródło
W przypadku standardowych wiązań należy używać konwerterów, które wyglądają na nieco wietrzne. Polecam więc przyjrzeć się mojemu projektowi CalcBinding , który został opracowany specjalnie w celu rozwiązania tego problemu i kilku innych. Dzięki zaawansowanemu wiązaniu możesz pisać wyrażenia o wielu właściwościach źródłowych bezpośrednio w xaml. Powiedz, możesz napisać coś takiego:
lub
lub
lub
gdzie A, B, C, IsChecked - właściwości viewModel i będzie działać poprawnie
źródło
<Setter.Value><cb:Binding Path="!IsReadOnly" /></Setter.Value>
dostaje „Wiązanie” nie jest poprawne dla błędu kompilacji Setter.Value ”Polecam korzystanie z https://quickconverter.codeplex.com/
Odwracanie wartości logicznej jest wtedy tak proste, jak:
<Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly}}" />
To przyspiesza czas potrzebny na napisanie konwerterów.
źródło
Chciałem, aby moja XAML pozostała tak elegancka, jak to możliwe, dlatego stworzyłem klasę do zawijania bool, który znajduje się w jednej z moich bibliotek współdzielonych, niejawne operatory pozwalają na użycie klasy jako bool w kodowaniu bezproblemowo
Jedyne zmiany potrzebne w projekcie to spowodowanie, że właściwość, którą chcesz odwrócić, zwraca to zamiast bool
A w postfiksie XAML powiązanie z wartością lub odwróceniem
źródło
bool
wyrażeń typu / zmiennych, nawet nie odwołując się do wartości odwrotnej. Zamiast tego dodam metodę rozszerzenia „Nie” do plikuBoolean
Struct
.Property
w porównaniuMethod
doBinding
. Moje oświadczenie „minus” nadal obowiązuje. Przy okazji metoda rozszerzenia „Boolean” „Not” jest nadal przydatna do unikania „!” Operator, którego łatwo pominąć, gdy (jak to często bywa) jest osadzony obok znaków, które wyglądają tak (tj. Jeden / więcej „(” i „l” i „I”).Ten działa również dla zerowalnych boolów.
źródło
Dodaj jeszcze jedną właściwość do modelu widoku, która zwróci wartość odwrotną. I przywiąż to do przycisku. Lubić;
w widoku modelu:
w xaml:
źródło
Nie wiem, czy dotyczy to XAML, ale w mojej prostej aplikacji Windows utworzyłem powiązanie ręcznie i dodałem moduł obsługi zdarzeń formatu.
źródło
Format
aParse
zdarzenia w powiązaniach WinForm są w przybliżeniu równoważne konwerterowi WPF.Miałem problem z inwersją, ale dobre rozwiązanie.
Motywacją było to, że projektant XAML pokazywałby pustą kontrolkę, np. Gdy nie istniał żaden
MyValues
tekst / brak (itemsource).Kod początkowy: ukryj kontrolę, gdy
MyValues
jest pusty. Ulepszony kod: pokaż kontrolę, gdyMyValues
NIE jest pusta lub pusta.Oczywiście problemem jest sposób wyrażenia „1 lub więcej przedmiotów”, co jest przeciwieństwem 0 przedmiotów.
Rozwiązałem to, dodając:
Ergo ustawia wartość domyślną dla wiązania. Oczywiście to nie działa na wszystkie rodzaje odwrotnych problemów, ale pomogło mi z czystym kodem.
źródło
💡 .Net Rdzeń Rozwiązanie 💡
Obsługuje sytuację zerową i nie zgłasza wyjątku, ale zwraca wartość,
true
jeśli nie zostanie podana żadna wartość; w przeciwnym razie pobiera wprowadzony Boolean i odwraca go.Xaml
App.Xaml Lubię umieszczać całą moją statystykę konwertera w pliku app.xaml, więc nie muszę ich ponownie konfigurować w oknach / stronach / kontrolkach projektu.
Dla jasności
converters:
jest to przestrzeń nazw rzeczywistej implementacji klasy (xmlns:converters="clr-namespace:ProvingGround.Converters"
).źródło
Po odpowiedzi @ Paula napisałem w ViewModel:
Mam nadzieję, że posiadanie fragmentu kodu pomoże komuś, prawdopodobnie nowicjuszowi, tak jak ja.
A jeśli popełnisz błąd, daj mi znać!
BTW, zgadzam się również z komentarzem @heltonbiker - to zdecydowanie poprawne podejście tylko wtedy , gdy nie musisz go używać więcej niż 3 razy ...
źródło
Zrobiłem coś bardzo podobnego. Swoją własność utworzyłem za scenami, które umożliwiały wybór skrzynki TYLKO, jeśli zakończy wyszukiwanie danych. Kiedy moje okno pojawia się po raz pierwszy, uruchamia komendę asynchronicznie ładowaną, ale nie chcę, aby użytkownik klikał kombinację podczas ładowania danych (byłby pusty, a następnie zostałby zapełniony). Więc domyślnie właściwość jest fałszywa, więc zwracam odwrotność w getterze. Następnie podczas wyszukiwania ustawiam właściwość na true, a po zakończeniu ponownie ustawiam na false.
Następnie dla combobox mogę go powiązać bezpośrednio z IsSearching:
źródło
Używam podobnego podejścia, jak @Ofaim
źródło