尝试在WPF中更改绑定的RadioButton时的奇怪行为

时间:2016-07-18 10:39:49

标签: c# wpf mvvm radio-button ivalueconverter

我已将Child窗口中的两个单选按钮绑定到我在EnumViewModel的{​​{1}},这是在主窗口中构建的。绑定按预期工作,但我注意到一个非常奇怪的行为,我无法解决。我在这里提供了所有代码,因此您可以轻松地为自己重建问题。

以下是查看这种奇怪行为的步骤:

  1. 单击MainWindow中的按钮
  2. ChildWindow打开,RadioButton设置为User
  3. 选择自动,然后再选择用户
  4. 关闭ChildWindow并重新打开它!尝试将RadioButton更改为自动。它不会改变!
  5.     <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,但我不知道为什么?它只是陷入了一个循环。

1 个答案:

答案 0 :(得分:2)

修改 如何将枚举转换为bool如下?

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

    return parameterEnum;
}