RadioButtons siyahısını ləğv etmək üçün necə?

Bu kimi bir qeyd var:

 public enum MyLovelyEnum { FirstSelection, TheOtherSelection, YetAnotherOne }; 

DataContext'də bir mülk var:

 public MyLovelyEnum VeryLovelyEnum { get; set; } 

Və mənim WPF müştərimdə üç RadioBoton var.

 <RadioButton Margin="3">First Selection</RadioButton> <RadioButton Margin="3">The Other Selection</RadioButton> <RadioButton Margin="3">Yet Another one</RadioButton> 

İndi, RadioButtonsları düzgün iki tərəfli cəlb etmək üçün bir obyektə necə bağlaya bilərəm?

334
29 дек. Sam 29 dekabrda təyin olundu. 2008-12-29 14:35 '09 at 14:35 2008-12-29 14:35
@ 7 cavab

Daha ümumi çeviricidən istifadə edə bilərsiniz.

 public class EnumBooleanConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string parameterString = parameter as string; if (parameterString == null) return DependencyProperty.UnsetValue; if (Enum.IsDefined(value.GetType(), value) == false) return DependencyProperty.UnsetValue; object parameterValue = Enum.Parse(value.GetType(), parameterString); return parameterValue.Equals(value); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string parameterString = parameter as string; if (parameterString == null) return DependencyProperty.UnsetValue; return Enum.Parse(targetType, parameterString); } #endregion } 

XAML hissəsində siz istifadə edirsiniz:

 <Grid> <Grid.Resources> <l:EnumBooleanConverter x:Key="enumBooleanConverter" /> </Grid.Resources> <StackPanel > <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=FirstSelection}">first selection</RadioButton> <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=TheOtherSelection}">the other selection</RadioButton> <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=YetAnotherOne}">yet another one</RadioButton> </StackPanel> </Grid> 
320
02 янв. cavab Lars 02 jan verildi . 2009-01-02 16:36 '09 at 16:36 'da 2009-01-02 16:36

Qəbul edilən cavabı da sadələşdirə bilərsiniz. Xaml içindəki simlər kimi yazaraq və çeviricinizdə daha çox iş görməyiniz əvəzinə simvolu təqdimat yerinə əvəzinə enum dəyərindən keçə bilərsiniz və CrimsonX şərhləri, səhvlər tərtib vaxtında tərtib edildikdə deyil:

ConverterParameter = {x: Statik Yerli: YourEnumType.Enum1}

 <StackPanel> <StackPanel.Resources> <local:EnumToBooleanConverter x:Key="EnumToBooleanConverter" /> </StackPanel.Resources> <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" /> <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" /> </StackPanel> 

Sonra çeviriciyi sadələşdirin:

 public class EnumToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value.Equals(parameter); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value.Equals(true) ? parameter : Binding.DoNothing; } } 

Qeyd Bir konteynerdə RadioBattonların bir neçə qrupu (17 fevral, 2011):

Xaml, açarları eyni ana konteynerə sahib olduqda, onlardan birini seçərkən bu konteynerdəki bütün digərləri ləğv edəcəklər (bir başqa əmlak ilə əlaqəli olsa belə). Buna görə də, RadioButton yığma paneli kimi konteynerində bir araya gələrək ümumi bir əmlakla əlaqəli olmağa çalışın. İlişkili RadioButtonsların bir ana konteyner paylayamadığı hallarda, hər RadioButton'un GroupName xüsusiyyətini mantıksal qruplaşdırılması üçün ümumi dəyərə təyin edin.

Qeyd Sinifə daxil olan siyahı növü (28 aprel 2011-ci il):

Sizin enum tipiniz bir sinifdə (və birbaşa ad boşluğuna deyil) yerləşdirildikdə, XAML-da enum-a daxil olmaq üçün "+" sözdizimini istifadə edə bilərsiniz, bu sualın cavabında (yoxsaylı) cavab verilmişdir . WPF-də statik link üçün enum növü tapılmayıb :

ConverterParameter = {x: Statik Yerli: YourClass + YourNestedEnumType.Enum1}

border=0

Buna görə, "Type 'local:YourClass+YourNestedEnumType' was not found." Microsoft Connect Sayı geliştiricisi artıq "Type 'local:YourClass+YourNestedEnumType' was not found." lakin layihə uğurla tərtib edir və həyata keçirir. Əlbəttə, birbaşa numaralandırma tipinizi ad boşluğuna daşıyırsanız bu problemdən qaçın.

Düzenle (16 dekabr '10):

Binding.DoNothing qayıtmaq təklif etdiyiniz üçün təşəkkür edirik, DependencyProperty.UnsetValue deyil.

Düzenle (5 aprel '11):

Sadələşdirilmiş ConvertBack - əgər Ternary operatorunu istifadə etsəydi.

Düzenle (27 yanvar 12):

Enum bayraqlarını istifadə edirsinizsə, konvertor bu kimi görünür:
 public class EnumToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ((Enum)value).HasFlag((Enum)parameter); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value.Equals(true) ? parameter : Binding.DoNothing; } } 

Düzenle (7, 15 may):

Nullable Enum halda (yəni, sualda göstərilmir, lakin bəzi hallarda, məsələn, verilənlər bazasından null qaytarır və ya proqram mantığında dəyər bərabər olmadıqda hər hansı bir zəruri ola bilər), başlanğıcın Null konvertasiya metodunu yoxlayın və aşağıda göstərildiyi kimi, adətən yalan olan (buna görə də istənilən radio düyməsini seçmək istəməsəniz) müvafiq bool dəyərini qaytarın:
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) { return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue); } return value.Equals(parameter); } 
473
26 мая '10 в 1:07 2010-05-26 01:07 cavab 26.05.2010 tarixində Scott tərəfindən verilmişdir 1:07 2010-05-26 01:07

EnumToBooleanConverter-ə cavab vermək üçün: DependencyProperty.UnsetValue qayıtmaq əvəzinə, IsChecked keçidinin dəyəri yanlış olduğu halda, bir Binding.DoNothing qaytarılması hesab edin. Köhnə bir problem (və istifadəçi qırmızı qutu və ya oxşar təsdiq göstəriciləri göstərə bilər), ikincisi sadəcə bu halda zəruri olan heç bir şeyin edilməsi lazım olduğunu göstərir.

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

25
03 сент. Cavab anon 03 Sentyabr verilir. 2010-09-03 17:40 '10 at 5:40 pm 2010-09-03 17:40

ListBox-da RadioButtons-dan istifadə edərdim və sonra SelectedValue-ə əlavə olundu.

Bu, bu mövzuda köhnə bir mövzudur, ancaq əsas fikir eyni olmalıdır: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/

5
29 дек. Martin Moser tərəfindən verilmiş cavab 29 Dekabr. 2008-12-29 14:51 '09 da 14:51 2008-12-29 14:51

UWP üçün bu asan deyil: sahə dəyərini bir parametr olaraq ötürmək üçün əlavə bir xalqa keçməlisiniz.

1-ci misal

Həm WPF, həm də UWP üçün etibarlıdır.

 <MyControl> <MyControl.MyProperty> <Binding Converter="{StaticResource EnumToBooleanConverter}" Path="AnotherProperty"> <Binding.ConverterParameter> <MyLibrary:MyEnum>Field</MyLibrary:MyEnum> </Binding.ConverterParameter> </MyControl> </MyControl.MyProperty> </MyControl> 

Məsələn 2

Həm WPF, həm də UWP üçün etibarlıdır.

 ... <MyLibrary:MyEnum x:Key="MyEnumField">Field</MyLibrary:MyEnum> ... <MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={StaticResource MyEnumField}}"/> 

Misal 3

Yalnız WPF üçün etibarlıdır!

 <MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static MyLibrary:MyEnum.Field}}"/> 

UWP x'yi dəstəkləmir x:Static , belə ki, nümunə 3 sualdan çıxır; nümunə ilə getdiyinizi fərz etsəniz, nəticə daha ətraflı bir koddur. Məsələn 2 bir qədər yaxşıdır, lakin hələ də mükəmməl deyil.

Həll

 public abstract class EnumToBooleanConverter<TEnum> : IValueConverter { public object Convert(object value, Type targetType, object parameter, string > 

Sonra, dəstəkləmək istədiyiniz hər bir növü üçün, transferin növünü əks etdirən bir çeviriciyi təyin edin.

 public class MyEnumToBooleanConverter : EnumToBooleanConverter<MyEnum> { //Nothing to do! } 

Qutuda olması lazım olan səbəb, ConvertBack metodunda tipə müraciət etmək üçün heç bir yol olmadığını göstərir; boks buna diqqət yetirəcək. İlk iki nümunədən birinə gedirsəniz, sadəcə parametr tipinə baxa bilərik, qutusuz sinifdən devralma ehtiyacını aradan qaldırır; Bütün bunları bir xəttdə və ən az verimliliklə etmək istəyirsinizsə, son həll mükəmməldir.

Istifadə nümunə 2-ə bənzəyir, amma əslində, daha az ətraflı.

 <MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource MyEnumToBooleanConverter}, ConverterParameter=Field}"/> 

Dezavantajı, dəstəkləmək istədiyiniz hər bir növü üçün bir çeviriciyi təyin etməlisiniz.

1
18 марта '17 в 9:04 2017-03-18 09:04 Cavab Ceyms M tərəfindən 18 Mart '17 'də 9:04 2017-03-18 09:04' də verilir

Yuxarıda təsvir edilmiş geniş fikirlər, radio düymələrini istənilən tipə (sayma, məntiqi, simli, tamsayı və s.) Bağlamağa və burada iş kodu nümunəsini təqdim etməyə imkan verir:

http://www.codeproject.com/Tips/720497/Binding-Radio-Buttons-to-a-Single-Property

1
04 февр. Cavab verilib votrubac 04 fevral. 2014-02-04 10:21 '14 saat 10:21 'da 2014-02-04 10:21

Scott'dan EnumToBooleanConverter əsasında. ConvertBack metodu Enum'da bayraq kodu ilə işləməyəcəyini fərq etdim.

Aşağıdakı kodu sınamışam:

 public class EnumHasFlagToBooleanConverter : IValueConverter { private object _obj; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { _obj = value; return ((Enum)value).HasFlag((Enum)parameter); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value.Equals(true)) { if (((Enum)_obj).HasFlag((Enum)parameter)) { // Do nothing return Binding.DoNothing; } else { int i = (int)_obj; int ii = (int)parameter; int newInt = i+ii; return (NavigationProjectDates)newInt; } } else { if (((Enum)_obj).HasFlag((Enum)parameter)) { int i = (int)_obj; int ii = (int)parameter; int newInt = i-ii; return (NavigationProjectDates)newInt; } else { // do nothing return Binding.DoNothing; } } } } 

targetType imkan verən yeganə şey targetType , buna görə də mən onu sıx bağladığım NavigationProjectDates , mən istifadə etdiyim enum. Və targetType == NavigationProjectDates ...


Daha ümumi bayraq zərf çeviricisi üçün dəyişiklik:

 ictimai sinif FlagsEnumToBooleanConverter: IValueConverter { Şəxsi int_flags = 0; ictimai obyekt Convert (obyekt dəyəri, targetType yazın, obyekt parametri, simli dil) { əgər (value == null) yalanı qaytarır; _flags = (int) dəyəri; Tövsiyə t = value.GetType (); obyekt o = Enum.ToObject (t, parametr); return ((Enum) dəyəri) .HasFlag ((Enum) o); } ictimai obyekt ConvertBack (obyekt dəyəri, hədəf hədəf növü, obyekt parametri, simli dil) { əgər (dəyər.? Equals (true)? false) { _flags = _flags |  (int) parametri; } başqa _flags = _flags  ~ (int) parametri; } qayıtmaq _flags; } }
0
11 июня '13 в 13:06 2013-06-11 13:06 Cavab KenGey tərəfindən 11 iyun '13 'də 13:06 2013-06-11 13:06' də verilir

haqqında digər suallar və ya sual verir