关于WPF RadioButton和CheckBox绑定问题

最近发现一个WPF里RadioButton的奇怪现象,由于在网上也没搜到合适的答案,遂记录一下:


现象:当一个对象集合里,对象的某些属性需要以RadioButton或者CheckBox的形式展现出来,并且会随着选择集合中不同的对象而变化时(如listbox,combobox),RadioButton绑定不会正确更新,而CheckBox则没问题;


这里以一个小例子来说明:


一个学生集合,每个学生其中包含一个性别属性Sex , 这里假如true表示男性,false表示女性:

    public class Student
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public bool Sex { get; set; }
    }

使用一个StudentViewModel作为前端的datacontext ,默认先来3个学生:

  public class StudentViewModel
    {
        public ObservableCollection Students { get; set; }

        public Student SelectedStudent { get; set; }

        public StudentViewModel()
        {
            Students = new ObservableCollection();
            Students.Add(new Student() { Name="Tom",  Age=20,Sex=true});
            Students.Add(new Student() { Name = "Jack",  Age =21,Sex=false});
            Students.Add(new Student() { Name = "Ailien", Age =22,Sex=true});
        }
    }

前端用一个ListBox和两个radiobutton来展示,选择不同学生的时候, radiobutton的值不会根据我的选择来正确变化


    
        
    
    
        
            
            
        

        
            
                
                    
                        
                            
                            
                        
                        
                    
                
            
        
        
            
                
                
                
                
                
            
            
	    
            
			 
	   

        

    

其中Converter代码为:

 public class InverseBooleanConverter : MarkupExtension, IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            bool boolVal = value == null ? false : (bool)value;
            return !boolVal;
        }

        public object ConvertBack(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(bool) && targetType != typeof(Visibility) && targetType != typeof(bool?))
            {
                throw new NotSupportedException();
            }
            return !(bool)value;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
        public InverseBooleanConverter() : base()
        {
        }
        #endregion
    }


但是如果把两个radiobutton换成CheckBox就没问题,每次选择学生都能够根据选择的学生正确显示性别



关于WPF RadioButton和CheckBox绑定问题_第1张图片

关于WPF RadioButton和CheckBox绑定问题_第2张图片


猜想可能是RadioButton和CheckBox内部原理不太一样,因为每次选择不同学生时,Radiobutton会时不时进入到ConvertBack函数中去,导致属性值错乱,而CheckBox则不会;

于是试着给每个RadioButton加上Mode=OneWay,因为RadioButton默认是TwoWay, 改完发现上面的问题没有了,能够正确更新状态,但是手动选择却不能使后台数据源属性生效了,最后发现只要给第二个RadioButton加上UpdateSourceTrigger=Explicit所有问题都解决了,后台也能根据前端界面值更改而更改:

原来UpdateSourceTrigger=Explicit是强制手动去call UpdateSource代码才使得后台数据生效,加上就相当于不要去更新第二个RadioButton的后台值,仅针对两个控件绑定一个属性的情况。

If you set the UpdateSourceTrigger value to Explicit, you must call the UpdateSource method or the changes will not propagate back to the source.

这么一想,还有一种同样的办法,就是给第二个RadioButton加上Mode=OneWay:


都能够解决问题。




你可能感兴趣的:(WPF,radio,button,checkbox,wvvm,conveter)