RadioButton一般用於單選的時候,也就是從一組值中選擇一個值。
比如性別有“男”和“女”兩種取值,而對於一個員工的實例來說,性別的取值要么是男,要么是女。
這種時候一般就會用到RadioButton。
RadioButton有一個IsChecked屬性用於表示是否選中,IsChecked屬性的值類型是bool,只能直接綁定bool類型的值。
然而對於大多數時候來說,這種多選一的值我們一般會采用枚舉等類型。比如性別我們會定義如下的枚舉:
public enum Sex { Male, Female }
對於員工類,我們作如下定義:
public class Employee : ModelBase { private string _name; public string Name { get { return _name; } set { _name = value; RaisePropertyChanged(() => Name); } } private Sex _sex; public Sex Sex { get { return _sex; } set { _sex = value; RaisePropertyChanged(() => Sex); } } }
而要將員工的性別屬性綁定到RaidoButton上,我們就需要使用到數據轉換器。我們定義一個名為SexToBoolConverter的數據轉換器來進行枚舉類型Sex和bool類型之間的轉換,如下所示:
public class SexToBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Sex s = (Sex)value; return s == (Sex)int.Parse(parameter.ToString()); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { bool isChecked = (bool)value; if (!isChecked) { return null; } return (Sex)int.Parse(parameter.ToString()); }
轉換器的Convert方法用於從Employee實例到RadioButton時的數據轉換,而ConvertBack用於從RaidoButton到Employee實例時的數據轉換。
這里需要注意ConvertBack方法中判斷value的值為false的時候,會直接返回null。
這樣寫是為了RadioButton的狀態變為未選中的時候,阻止數據傳回Employee的實例。這一點非常重要,如果不這樣做,值更新會在兩個RadioButton之間形成一個環路,導致RadioButton不能正常工作。
關於數據轉換器的更多信息,大家可以到MSDN上查看,這里就不詳細解釋了。
下面看看如何使用我們定義好的數據轉換器,請看下面的xaml代碼:
xmlns:local="clr-namespace:WpfApplication1.Views"
將上面這句代碼添加到要使用轉換器的xaml頁面的命名空間引用,將其中的WpfApplication1.Views替換為你轉換器所在的命名空間,當你的轉換器位於另一個程序集的時候,你還需要使用assembly關鍵字來指定該程序集的名稱。
然后我們在頁面資源中定義一個該轉換器的靜態資源,如下所示:
<Window.Resources> <local:SexToBoolConverter x:Key="SexToBoolConverter"></local:SexToBoolConverter> </Window.Resources>
如何在RadioButton上面使用呢?請看下面的代碼:
<RadioButton GroupName="Sex" IsChecked="{Binding Model.SelectedEmployee.Sex,Converter={StaticResource SexToBoolConverter},ConverterParameter=0}">男</RadioButton> <RadioButton GroupName="Sex" IsChecked="{Binding Model.SelectedEmployee.Sex,Converter={StaticResource SexToBoolConverter},ConverterParameter=1}">女</RadioButton>
我們將當前選中員工的Sex屬性綁定到RadioButton的IsChecked屬性上,並指定綁定時需要使用SexToBoolConverter轉換器,使用ConverterParameter來指定轉換器使用的參數。
示例代碼:點擊下載
