Привязка радиокнопки WPF - здесь есть ошибка в этом коде? - PullRequest
0 голосов
/ 08 сентября 2010

Попытка заставить работать привязку радиокнопок, но с ошибкой во время выполнения с кодом ниже.Хотите, чтобы переключатели работали так, чтобы за один раз можно было выбрать только одну, и чтобы они правильно связывались двумя способами.Текст ошибки

"При вызове конструктора типа 'testapp1.MainWindow', который соответствует указанным ограничениям привязки, возникло исключение"

<Window x:Class="testapp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:l="clr-namespace:testapp1" Title="MainWindow" Height="350" Width="525">
    <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>
            <Label Content="{Binding Path=VeryLovelyEnum}" Height="28" Name="label1" />
        </StackPanel>

    </Grid>
</Window>

И код:

namespace testapp1
{
    public partial class MainWindow : Window
    {
        public TestModel _model;

        public MainWindow()
        {
            InitializeComponent();

            InitializeComponent();
            _model = new TestModel();
            this.DataContext = _model;
        }

    }

    public enum MyLovelyEnum
    {
        FirstSelection,
        TheOtherSelection,
        YetAnotherOne
    };


    public class TestModel : DependencyObject
    {

        public MyLovelyEnum VeryLovelyEnum
        {
            get { return (MyLovelyEnum)GetValue(VeryLovelyEnumProperty); }
            set { SetValue(VeryLovelyEnumProperty, value); }
        }
        public static readonly DependencyProperty VeryLovelyEnumProperty =
            DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(0));



    // from /371857/kak-privyazat-radiobuttons-k-perechisleniy
    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
    }

}

Кнопка и метка есть в предыдущем тесте, который я провел - я только что ушел в ...

1 Ответ

2 голосов
/ 08 сентября 2010

В следующем объявлении вместо целевого значения по умолчанию используется целое число. Может быть ваша проблема с созданием экземпляра ...

public static readonly DependencyProperty VeryLovelyEnumProperty = 
            DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(0)); 

Попробуйте что-то вроде ...

public static readonly DependencyProperty VeryLovelyEnumProperty = 
            DependencyProperty.Register("VeryLovelyEnum", typeof(MyLovelyEnum), typeof(TestModel), new UIPropertyMetadata(MyLovelyEnum.FirstSelection)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...