SORU
29 Aralık 2008, PAZARTESİ


Nasıl bir numaralama için RadioButtons bağlamak için?

Böyle bir sıralama var:

public enum MyLovelyEnum
{
  FirstSelection,
  TheOtherSelection,
  YetAnotherOne
};

Benim DataContext bir özelliği var:

public MyLovelyEnum VeryLovelyEnum { get; set; }

Ve WPF müvekkilim üç RadioButtons aldım.

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

Şimdi nasıl düzgün bir özellik RadioButtons bağlama iki yönlü bağlayıcı mı?

CEVAP
25 Mayıs 2010, Salı


Daha fazla kabul gören bir cevap basitleştirebilirsiniz. Yerine yazdığımızda çeteleler gibi dizeleri xaml ve yaparken daha fazla iş senin dönüştürücü daha gerekli, açıkça geçişte numaralama değeri yerine bir dize temsilini ve CrimsonX olarak yorumladı, hatalarıyla atılan derleme zamanında yerine çalışma zamanı:

ConverterParameter={x:Static yerel: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 da basitleştirmek dönüştürücü:

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;
    }
}

Not - aynı kap içinde RadioButton öğesinin Birden fazla grup (17 Şubat '11):

Eğer radyo düğmeleri aynı üst kapsayıcı paylaşmak xaml, sonra bir seçme olacak de-tümünü seç diğer konteyner ise farklı bir özelliğe bağlı olan, hatta () içinde. Yani ortak bir özellik bir arada gibi kendi kabı içinde gruplandırılmış bağlı eğer Button panel yığın tutmaya çalışın. Eğer ilgili RadioButtons tek ebeveyn paylaşmak imkansız olduğu durumlarda kap, sonra bunları mantıksal olarak grup için ortak bir değer için her List of grup adı özelliğini ayarlayın.

Not - Sıralama türü bir sınıf iç içe (28 '11) Yorum:

Eğer numaralama türü iç içe geçmiş bir sınıf (yerine doğrudan ad), belki de kullanabilir ' sözdizimi erişim numaralama XAML belirtildiği gibi bir (işaretli değil) cevap soru Unable to find enum type for static reference in WPF:

. ben^>={X:Static yerel: . ConverterParameter ^b>YourClassYourNestedEnumType.Enum1}

Bu nedenle Microsoft Connect Issue ancak, VS2010 tasarımcı artık "Type 'local:YourClass YourNestedEnumType' was not found.", belirten yük olacak ama projeyi başarıyla derlemek ve çalıştırmak. Tabii ki, eğer ad numaralama türünü taşımak mümkün doğrudan bu sorunu önleyebilirsiniz.

(16 Aralık '10): . Düzenle

Dönen Bağlama öneren anon için teşekkürler.Yapmaz yerine DependencyProperty.UnsetValue.

(5 Nisan '11): . Düzenle

Basitleştirilmiş ConvertBack-eğer başka bir Üçlü Operatör kullanımı.

(Jan 27 '12): . Düzenle

Eğer Numaralama bayrakları kullanarak, dönüştürücü aşağıdaki gibi olacaktı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;
    }
}

(7 Mayıs '15): . Düzenle

Null bir Numaralama (yani . bu durumda ^strong>değilsorulan soru, ama olması gereken bazı durumlarda, örneğin ORM dönen boş, DB ya da ne zaman olabilir mantıklı bu programın mantığı değeri değil sağlanan), hatırlamak için bir eklenti ilk boş onay Dönüştürme Yöntemi ve dönüş uygun bool değeri, genellikle yanlış (eğer istemiyorsan herhangi bir radyo düğmesi seçili), aşağıdaki gibi:

    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);
    }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • Thom Hall

    Thom Hall

    24 Kasım 2006