WPF中RadioButton綁定數據的正確方法


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來指定轉換器使用的參數。

 

示例代碼:點擊下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM