Mam wyliczenie takie jak to:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
Mam właściwość w moim DataContext:
public MyLovelyEnum VeryLovelyEnum { get; set; }
I mam trzy RadioButtons w moim kliencie WPF.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Jak teraz powiązać RadioButtons z właściwością, aby uzyskać prawidłowe dwukierunkowe wiązanie?
Odpowiedzi:
Możesz użyć bardziej ogólnego konwertera
A w części XAML używasz:
źródło
Możesz dodatkowo uprościć przyjętą odpowiedź. Zamiast wpisywać wyliczenia jako ciągi znaków w xaml i wykonywać więcej pracy w konwerterze, niż to konieczne, możesz jawnie przekazać wartość wyliczenia zamiast reprezentacji ciągu, a jak skomentował CrimsonX, błędy są generowane w czasie kompilacji, a nie w czasie wykonywania:
ConverterParameter = {x: Statyczny lokalny: YourEnumType.Enum1}
Następnie uprość konwerter:
Edycja (16 grudnia 10):
Dzięki anon za sugerowanie zwrotu Binding.DoNothing zamiast DependencyProperty.UnsetValue.Uwaga - Wiele grup przycisków RadioButtons w tym samym kontenerze (17 lutego 11):
W Xaml, jeśli przyciski opcji współużytkują ten sam kontener nadrzędny, wówczas wybranie jednego spowoduje odznaczenie wszystkich pozostałych w tym kontenerze (nawet jeśli są powiązane z inną właściwością). Staraj się więc trzymać RadioButton, które są powiązane ze wspólną właściwością, zgrupowane w osobnym pojemniku, takim jak panel stosu. W przypadkach, gdy powiązane RadioButton nie mogą współużytkować jednego kontenera nadrzędnego, ustaw właściwość GroupName każdego RadioButton na wspólną wartość, aby logicznie pogrupować je.Edytuj (5 kwietnia 11):
Uproszczone narzędzie ConvertBack, jeśli jeszcze, aby użyć operatora trójskładnikowego.Uwaga - typ enum zagnieżdżony w klasie (28 kwietnia '11):
Jeśli Twój typ wyliczenia jest zagnieżdżony w klasie (zamiast bezpośrednio w przestrzeni nazw), możesz użyć składni „+”, aby uzyskać dostęp do wyliczenia w XAML, jak podano w (nieoznaczonej) odpowiedzi na pytanie Nie można znaleźć typ wyliczenia dla odniesienia statycznego w WPF :ConverterParameter = {x: Statyczny lokalny: YourClass + YourNestedEnumType.Enum1}
Z powodu tego problemu z Microsoft Connect projektant w VS2010 nie będzie już ładował deklaracji
"Type 'local:YourClass+YourNestedEnumType' was not found."
, ale projekt się kompiluje i uruchamia pomyślnie. Oczywiście możesz uniknąć tego problemu, jeśli możesz przenieść typ wyliczenia bezpośrednio do przestrzeni nazw.Edytuj (27 stycznia 12):
Jeśli używasz flag Enum, konwerter wyglądałby następująco:Edycja (7 maja 15):
W przypadku Nullable Enum (które nie jest zadawane w pytaniu, ale może być potrzebne w niektórych przypadkach, np. ORM zwraca wartość null z DB lub ilekroć może mieć sens, że w logice programu wartość nie jest podana), pamiętaj, aby dodać początkowe sprawdzenie wartości zerowej w metodzie konwersji i zwrócenie odpowiedniej wartości bool, zwykle jest to fałsz (jeśli nie chcesz, aby wybrany został żaden przycisk opcji), jak poniżej:Uwaga - wyjątek NullReferenceException (10 października 18):
Zaktualizowano przykład, aby usunąć możliwość zgłaszania wyjątku NullReferenceException.IsChecked
jest typem zerowalnym, więc powrótNullable<Boolean>
wydaje się rozsądnym rozwiązaniem.źródło
W przypadku odpowiedzi EnumToBooleanConverter: Zamiast zwracać DependencyProperty.UnsetValue, rozważ zwrócenie Binding.DoNothing w przypadku, gdy wartość przycisku IsChecked przycisku opcji staje się false. Pierwszy wskazuje na problem (i może pokazywać użytkownikowi czerwony prostokąt lub podobne wskaźniki walidacji), a drugi wskazuje po prostu, że nie należy nic robić, co jest w tym przypadku potrzebne.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
źródło
Chciałbym użyć RadioButtons w ListBox, a następnie połączyć się z SelectedValue.
To jest starszy wątek na ten temat, ale podstawowa idea powinna być taka sama: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
źródło
W przypadku UWP nie jest to takie proste: musisz przeskoczyć przez dodatkowy obręcz, aby przekazać wartość pola jako parametr.
Przykład 1
Obowiązuje zarówno dla WPF, jak i UWP.
Przykład 2
Obowiązuje zarówno dla WPF, jak i UWP.
Przykład 3
Ważne tylko dla WPF!
UWP nie obsługuje,
x:Static
więc Przykład 3 nie wchodzi w rachubę; zakładając, że korzystasz z przykładu 1 , wynikiem jest bardziej szczegółowy kod. Przykład 2 jest nieco lepszy, ale wciąż nie jest idealny.Rozwiązanie
Następnie dla każdego typu, który chcesz obsługiwać, zdefiniuj konwerter, który boksuje typ wyliczeniowy.
Powodem, dla którego należy umieścić w ramce jest to, że pozornie nie ma możliwości odwołania się do typu w
ConvertBack
metodzie; zajmuje się tym boks. Jeśli wybierzesz jeden z dwóch pierwszych przykładów, możesz po prostu odwołać się do typu parametru, eliminując potrzebę dziedziczenia po klasie pudełkowej; jeśli chcesz zrobić to wszystko w jednym wierszu i przy możliwie najmniejszej szczegółowości, to drugie rozwiązanie jest idealne.Użycie przypomina przykład 2 , ale w rzeczywistości jest mniej szczegółowe.
Minusem jest to, że musisz zdefiniować konwerter dla każdego typu, który chcesz obsługiwać.
źródło
Utworzyłem nową klasę do obsługi powiązania RadioButtons i CheckBoxes z wyliczeniami. Działa dla oznaczonych wyliczeń (z wieloma zaznaczeniami pól wyboru) i nieoznaczonych wyliczeń dla pól wyboru pojedynczego wyboru lub przycisków opcji. Nie wymaga też żadnych przetworników ValueConverters.
Na początku może się to wydawać bardziej skomplikowane, ale po skopiowaniu tej klasy do projektu jest to zrobione. Jest ogólny, więc można go łatwo użyć do dowolnego wyliczenia.
Aby dowiedzieć się, jak z niego korzystać, załóżmy, że masz enum do uruchamiania zadania ręcznie lub automatycznie i można go zaplanować na dowolne dni tygodnia, a niektóre opcjonalne opcje ...
Oto, jak łatwo można korzystać z tej klasy:
Oto, jak łatwo jest powiązać pola wyboru i przyciski opcji z tą klasą:
źródło
EnumSelection<StartTask>
obiektem. Jeśli spojrzysz na definicjęEnumSelection<T>
, zobaczysz, że ma ona właściwość Value. Dlatego model widoku nie musi mieć „SelectedStartTask”. UżyłbyśStartUp.Value
. Jeśli chodzi o wartość domyślną Undefined, zobacz trzeci wyliczenie, AdditionalOptions, ma ona wartość None zamiast Undefined, ale możesz zmienić jej nazwę na dowolną.Działa to również w przypadku Checkbox .
Wiązanie pojedynczego wyliczenia z wieloma polami wyboru.
źródło
Na podstawie EnumToBooleanConverter firmy Scott. Zauważyłem, że metoda ConvertBack nie działa na Enum z kodem flag.
Próbowałem następującego kodu:
Jedyną rzeczą, której nie mogę zabrać do pracy, jest obsada od
int
do,targetType
więc ustawiłem ją na sztywnoNavigationProjectDates
, do enum, którego używam. ItargetType == NavigationProjectDates
...Edytuj dla bardziej ogólnego konwertera Flag Enum:
źródło
Możesz tworzyć przyciski radiowe dynamicznie,
ListBox
możesz to zrobić bez konwerterów, dość proste.Konkretne kroki są poniżej: utwórz ListBox i ustaw pozycję ItemsSource dla pola listy jako wyliczenie
MyLovelyEnum
i powiąż SelectedItem obiektu ListBox zVeryLovelyEnum
właściwością. Następnie zostaną utworzone przyciski opcji dla każdego ListBoxItem.Control Template
wypełnij każdy element jako przycisk opcjiZaletą jest poniżej: jeśli pewnego dnia zmiany klasy enum, nie trzeba zaktualizować GUI (plik XAML).
Referencje: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
źródło