Странное поведение при попытке изменить привязанную RadioButton в WPF

Я связал две радио кнопки в моемChild окно вEnum в моемViewModel который построен в главном окне. Привязка работает, как и ожидалось, но я заметил очень странное поведение, которое я не могу решить. Я предоставил здесь весь код, чтобы вы могли легко решить проблему для себя.

Вот шаги, чтобы увидеть это странное поведение:

Нажмите на кнопку в главном окнеChildWindow открывается, и RadioButton устанавливается на UserВыберите «Автоматически», а затем снова «Выберите пользователя».Закройте ChildWindow и снова откройте его! Попробуйте изменитьRadioButton Автоматически. Это не изменится!
    <Window x:Class="RadioButtonBinding.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">

        <Button Content="Display Child Window" Click="DisplayChildWindow"/> 
    </Window>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            var viewModel = new ViewModel();
            DataContext = viewModel;
        }

        private void DisplayChildWindow(object sender, RoutedEventArgs e)
        {
            var win = new ChildWindow {DataContext = (ViewModel) DataContext};
            win.ShowDialog();
        }
    }
    <Window x:Class="RadioButtonBinding.ChildWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:radioButtonBinding="clr-namespace:RadioButtonBinding"
            Title="ChildWindow" Height="300" Width="300">
        <Window.Resources>
            <radioButtonBinding:EnumBooleanConverter x:Key="EnumBooleanConverter"/>
        </Window.Resources>

        <StackPanel>
            <RadioButton Content="Automatic" 
                         GroupName="CalcMode"
                         IsChecked="{Binding Path=CalcMode, 
                                             Converter={StaticResource EnumBooleanConverter}, 
                                             ConverterParameter={x:Static radioButtonBinding:CalcMode.Automatic}}"/>

            <RadioButton Content="Custom"
                         GroupName="CalcMode"
                         IsChecked="{Binding Path=CalcMode, 
                                             Converter={StaticResource EnumBooleanConverter}, 
                                             ConverterParameter={x:Static radioButtonBinding:CalcMode.User}}"/>
        </StackPanel>
    </Window>
    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        private CalcMode calcMode = CalcMode.User;
        public CalcMode CalcMode
        {
            get { return calcMode; }
            set
            {
                calcMode = value;
                RaisePropertyChanged("CalcMode");
            }
        }

        private void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler == null) return;

            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public class EnumBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var paramEnum = parameter as Enum;
            var valueEnum = value as Enum;

            return Equals(paramEnum, valueEnum);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var parameterEnum = parameter as Enum;
            if (parameterEnum == null)
                return DependencyProperty.UnsetValue;

            return parameterEnum;
        }
    }

    public enum CalcMode : byte
    {
        Automatic,

        User,
    }

ОБНОВИТЬ:

Я подозреваю, что это должно бытьConverter но я не знаю почему? Это просто падает в петлю.

 Jammer18 июл. 2016 г., 12:48
 Vahid18 июл. 2016 г., 12:57
@Jammer Спасибо за статью. Для текущего проекта мне нужно придерживаться метода, упомянутого в вопросе. Есть идеи, почему это не работает? Часть преобразователя, кажется, попадает в цикл!
 Vahid18 июл. 2016 г., 13:04
@Jammer Вот почему я используюConverter.
 Jammer18 июл. 2016 г., 13:04
Значение радиокнопкиchecked это bool не Enum ...msdn.microsoft.com/en-us/library/...
 Vahid18 июл. 2016 г., 13:20
@ASh Большое спасибо ASh, я обновил шаги в моем вопросе. Как и следовало ожидать, это было из-за конвертера. Ваше решение, кажется, работает. Пожалуйста, отправьте это как ответ, чтобы я мог выбрать это.
 ASh18 июл. 2016 г., 13:13
@Vahid, я скопировал полный пример, но не могу воспроизвести проблему. Но все же, попробуйте проверитьvalue в методе ConvertBack:var parameterEnum = parameter as Enum; bool? ischecked = value as bool?; if (parameterEnum != null && ischecked == true) return parameterEnum; return DependencyProperty.UnsetValue;
 Vahid18 июл. 2016 г., 12:46
@ Джаммер Нет, почему? но это не работает, даже если я не наследую.
 Jammer18 июл. 2016 г., 12:45
Любая конкретная причина вашегоenum наследуетсяbyte?

Ответы на вопрос(1)

Решение Вопроса

РЕДАКТИРОВАТЬ Как насчет преобразования enum в bool следующим образом?

 Type targetType, object parameter, CultureInfo culture)
{
    if (parameter == null || !(bool)value)
        return DependencyProperty.UnsetValue;
    var parameterEnum = parameter as Enum;

    return parameterEnum;
}
 Vahid18 июл. 2016 г., 13:02
Но это не работает. В моемViewModel Я определил значение какEnum поэтому я должен ConvertBack en enum.
 Vahid18 июл. 2016 г., 13:34
Благодарю. Это работает.

Ваш ответ на вопрос