wpf RadioButton控件的一个bug,onpropertychanged后会修改旧属性的值

测试代码下载:https://files.cnblogs.com/djangochina/RadioButtonBug.zip

从上面列表选择不同的行,再设置下面不同的radiobutton看看结果

 

bug情况简单描述如下

一个列表控件listbox、listview或者datagrid,绑定如下

SelectedItem="{Binding SelectedData}"

当然这个SelectedData是一个实现了INotifyPropertyChanged的实体。比如说是Person,里面有 IsMan和IsWoman两个bool

绑定到两个RadionButton

<RadioButton IsChecked="{Binding IsMan}" Content="Man"/>
                                        <RadioButton IsChecked="{Binding IsWoman}" Content="Woman"/>

当来回切换列表控件的选中项的时候会发现这两个RadioButton的值会有错误,会修改旧选中项属性的值。

解决方法

    public class RadioButtonExtended : RadioButton
    {
        public static readonly DependencyProperty IsCheckedExtProperty =
            DependencyProperty.Register("IsCheckedExt", typeof(bool?), typeof(RadioButtonExtended),
                                        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsCheckedRealChanged));

        private static bool _isChanging;

        public RadioButtonExtended()
        {
            Checked += RadioButtonExtendedChecked;
            Unchecked += RadioButtonExtendedUnchecked;
        }

        public bool? IsCheckedExt
        {
            get
            {
                return (bool?)GetValue(IsCheckedExtProperty);
            }
            set
            {
                SetValue(IsCheckedExtProperty, value);
            }
        }

        public static void IsCheckedRealChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            _isChanging = true;
            ((RadioButtonExtended)d).IsChecked = (bool)e.NewValue;
            _isChanging = false;
        }

        private void RadioButtonExtendedChecked(object sender, RoutedEventArgs e)
        {
            if (!_isChanging)
                IsCheckedExt = true;
        }

        private void RadioButtonExtendedUnchecked(object sender, RoutedEventArgs e)
        {
            if (!_isChanging)
                IsCheckedExt = false;
        }
    }

 

使用

<controls:RadioButtonExtended GroupName="Sex" IsCheckedExt="{Binding IsMan}" Content="Man"/>
<controls:RadioButtonExtended GroupName="Sex" IsCheckedExt="{Binding IsWoman}" Content="Woman"/>

 

posted @ 2013-12-25 21:02  Django中国  阅读(1766)  评论(4编辑  收藏  举报