【问题标题】:Odd behavior when trying to change a bound RadioButton in WPF尝试更改 WPF 中绑定的 RadioButton 时的奇怪行为
【发布时间】:2016-11-20 22:29:55
【问题描述】:

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

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

  1. 单击主窗口中的按钮
  2. ChildWindow 打开并且 RadioButton 设置为 User
  3. 选择自动,然后再次选择用户
  4. 关闭 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,但我不知道为什么?它只是陷入了一个循环。

【问题讨论】:

  • 您的enum 继承byte 的任何特殊原因?
  • @Jammer 不,为什么?但即使我不继承它也不起作用。
  • @Jammer 感谢您的文章。对于当前的项目,我需要坚持问题中提到的方法。任何想法为什么它不起作用?转换器部分似乎陷入了循环!
  • @Jammer 这就是我使用Converter的原因。

标签: c# wpf mvvm radio-button ivalueconverter


【解决方案1】:

编辑 如下将 enum 转换为 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;
}

【讨论】:

  • 但这不起作用。在我的ViewModel 中,我已将值定义为Enum,因此我必须将其转换回 en Enum。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 2013-09-29
  • 2018-07-02
  • 2013-09-22
  • 2012-12-25
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多