WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定

馋奶兔 提交于 2020-04-27 06:14:36
原文: WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定

 

WPF MVVM从入门到精通1:MVVM模式简介

WPF MVVM从入门到精通2:实现一个登录窗口

WPF MVVM从入门到精通3:数据绑定

WPF MVVM从入门到精通4:命令和事件

WPF MVVM从入门到精通5:PasswordBox的绑定

WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定

WPF MVVM从入门到精通7:关闭窗口和打开新窗口

WPF MVVM从入门到精通8:数据验证

完整示例代码下载LoginDemo

 

当我们要进行性别这一属性绑定的时候,我们会发现,两个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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!