nie znalazłem szczególnie łatwy w obsłudze sposób, aby umieścić wyrażenie do XAML, więc oto co używam zamiast:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding { Source = myObject,
Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
(int selectedIndex) => selectedIndex >= 0
));
Będziesz musiał napisać to w języku C#, na przykład w konstruktorze okna.
To działa również bezproblemowo dla wielo-pozyskiwane wiązań:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding { Source = myObject,
Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
new Binding { Source = myObject2,
Path = new PropertyPath(Button.ActualHeightProperty) },
(int selectedIndex, double height) => selectedIndex >= 0 && height > 10.5
));
Zauważ, że lambda jest statycznie wpisane, a wszelkie błędy typu są (względnie) hałaśliwe, pomaga śledzić je w dół. Uwzględniany jest również typ powrotu lambda; można go użyć do powiązania szerokości jednego obiektu jako złożonej formuły opartej na szerokości innego ...
Ta klasa LambdaBinding
nie jest wbudowana; musisz dołączyć plik LambdaBinding.cs.
Nota boczna. To wstyd, że XAML nie zezwala na wyrażenia. Tak, zdaję sobie sprawę, że XAML ma być "dla projektantów" i wolny od tej nieuchwytnej rzeczy, którą nazywamy logiką aplikacji , ale kogo tutaj żartujemy ... Po pierwsze, w drugiej odpowiedzi pokazany jest DataTrigger
, który jest w zasadzie wyrażeniem warunkowym, i tak nie różni się (tylko dużo dłuższa) niż {Binding source.SelectedIndex >= 0}
. Po drugie, jeśli pomysł jest prosty, to wiążące wyrażenia, które projektant powinien być w stanie napisać, wykraczają daleko poza możliwości nie programisty ... jeśli potrzebujesz dowodu, rozważ coś takiego:
{Binding RelativeSource={RelativeSource AncestorType={x:Type UIElement},
AncestorLevel=1},
Path=IsEnabled}
Dzięki, mogę użyć tego dla jednego z moich przycisków, ale drugi będzie tam, gdzie SelectedIndex> = 1. Czy mogę zrobić to jak twój przykład powyżej, ale tylko z MultiDataTrigger? –
MultiDataTrigger jest używany, gdy warunki są połączone razem. Aby wykonać SelectedIndex> = 1, skopiuj datatrigger dla "-1" i zmień wartość wyzwalania na "0". –