zoukankan      html  css  js  c++  java
  • WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定

    当我们要进行性别这一属性绑定的时候,我们会发现,两个RadioButton控件都跟一个Gender属性关联。其实我们在绑定控件时还会遇到这样一个问题:属性是一个bool类型,但需要绑定控件的Visibility属性。这个问题也可以在本文介绍的方法得到解决。

    控件在绑定时,是可以设置一个Converter的。Converter有两个方法,分别是Convert和ConvertBack。Convert用于将数据格式化之后,显示到控件上。而ConvertBack就是在界面端修改了控件状态,数据应该如何变化。

    以下是一个比较通用的RadioButton的Converter:

        using System;
        using System.Globalization;
        using System.Windows.Data;
         
        namespace LoginDemo.ViewModel.Common
        {
            public class CheckConverter : IValueConverter
            {
                public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
                {
                    if (value == null || parameter == null)
                    {
                        return false;
                    }
                    string checkvalue = value.ToString();
                    string targetvalue = parameter.ToString();
                    bool r = checkvalue.Equals(targetvalue);
                    return r;
                }
         
                public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
                {
                    if (value == null || parameter == null)
                    {
                        return null;
                    }
         
                    if ((bool)value)
                    {
                        return parameter.ToString();
                    }
                    return null;
                }
            }
        }

    在XAML处,需要先增加Converter的资源:

        <Window.Resources>
            <c:CheckConverter x:Key="CheckConverter"/>
        </Window.Resources>

    然后RadioButton的代码修改如下:

        <RadioButton Grid.Row="2" Grid.Column="0" Content="男" IsChecked="{Binding Gender,Mode=TwoWay,Converter={StaticResource CheckConverter},ConverterParameter=1}"/>
        <RadioButton Grid.Row="2" Grid.Column="1" Content="女" IsChecked="{Binding Gender,Mode=TwoWay,Converter={StaticResource CheckConverter},ConverterParameter=2}"/>

    ViewModel里增加的代码就没什么新意了:

        /// <summary>
        /// 性别
        /// </summary>
        public int Gender
        {
            get
            {
                return obj.Gender;
            }
            set
            {
                obj.Gender = value;
                this.RaisePropertyChanged("Gender");
            }
        }

    这样绑定以后,当Gender=2时,性别女的单选框会被选中;当性别男的单选框被选中后,Gender会变成1。

  • 相关阅读:
    cereal:C++实现的开源序列化库
    随笔
    我们一起成长
    青岛近代历史和文化资料整理
    Codeforces Round #580 (Div. 2)-D. Shortest Cycle(思维建图+dfs找最小环)
    CodeForces
    PAT甲级1151(由前序和中序确定LCA)
    记录使用vs code两天的心得
    AcWing 285. 没有上司的舞会(树形dp入门)
    POJ-3255-Roadblocks(次短路的另一种求法)
  • 原文地址:https://www.cnblogs.com/ljdong7/p/12058049.html
Copyright © 2011-2022 走看看