无线电按钮验证

时间:2015-06-16 20:05:35

标签: c# wpf validation data-binding radio-button

我真的不确定怎么说这个,所以这里就是。

我的WPF应用程序中的表单上有一些单选按钮已经过验证。它们基本上是此表单的必填字段。

当我开始填写表格时,两个单选按钮都标有红色边框,但是当我选择其中一个按钮时。发生这种情况:

enter image description here

我该如何解决这个问题?我知道我可以将控件更改为ComboBox之类的东西,但通常电子表单上的性别字段是单选按钮。

我已经尝试将验证显示在包含单选按钮的堆栈面板上,但它什么也没做。

我无法为性别设置一个默认值,因为它会被忽视,并会引起投诉/误解。

上图中的XAML位于:

<StackPanel Grid.Column="1" Grid.Row="3" Orientation="Horizontal">
    <RadioButton GroupName="Gender" Content="Male" IsChecked="{Binding Gender, Converter={StaticResource GenderToCharConverter}, ConverterParameter=M}"/>
    <RadioButton GroupName="Gender" Content="Female" IsChecked="{Binding Gender, Converter={StaticResource GenderToCharConverter}, ConverterParameter=F}"/>
</StackPanel>

编辑:为了更清楚地说明我的问题,当我打开此表单的新实例时,两个单选按钮都标有验证边框,因为它们应该是必需的此表单上的字段。

当选择性别时,验证边框仅从单击的单选按钮中删除,实际上我可以想象应该删除两个边框,因为数据绑定属性现在具有值。

它似乎删除此边框的唯一方法是单击另一个选项以删除,然后重新选择原始值。这不应该发生在这个表格上,因为这可能会使用户感到困惑,并让他们误认为性别控制仍然存在问题,而且它看起来就像一个错误。

编辑2: This问题修复了边框显示,但随后隐藏了需要选择其中一个单选按钮的事实。是不是有办法在StackPanel周围放置边框而不是单独的单选按钮。似乎绝对没有关于如何在Google上实现这一点的例子,这完全是愚蠢的。

编辑3:相关代码。

// Gender property in the viewmodel.
[Required(AllowEmptyStrings=false, ErrorMessage="Gender is a required field.")]
    public string Gender
    {
        get { return _currentMember.Gender; }
        set
        {
            if(value != _currentMember.Gender)
            {
                _currentMember.Gender = value;
                RaisePropertyChanged();
                Validate(_currentMember.Gender);
            }
        }
    }

// Converter
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
            string input = (string)value;
            string test = (string)parameter;
            return input == test;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !(value is bool))
            return string.Empty;

        if (parameter == null || !(parameter is string))
            return string.Empty;

        if ((bool)value)
            return parameter.ToString();

        else
            return string.Empty;
    }

2 个答案:

答案 0 :(得分:2)

在我看来,你有两个解决方案:第一个 - 最简单的一个 - 是为 Gender 属性设置默认值。通过这种方式,将检查两个单选按钮中的一个,并且始终满足“required”属性。

&#xA;&#xA;

第二个解决方案是将ListView“屏蔽”为RadioButtonGroup 。对于我的示例,我使用了一个非常直观的框架来使用属性执行验证。您可以在此处找到它。 。

&#xA;&#xA;

因此,我没有使用堆栈面板,而是编写了这段XAML:

&#xA;&#xA;
 &lt ; ListView SelectedValue =“{Binding Gender,ValidatesOnDataErrors = True}”&#xA; SelectedValuePath =“Tag”BorderThickness =“0”Margin =“2”SelectionMode =“Single”&gt;&#xA;&#xA; &lt; RadioButton GroupName =“Gender”Margin =“2”Tag =“M”Content =“Male”IsChecked =“{Binding RelativeSource = {RelativeSource AncestorType = ListViewItem},Path = IsSelected}”/&gt;&#xA; &lt; RadioButton GroupName =“Gender”Margin =“2”Tag =“F”Content =“Female”IsChecked =“{Binding RelativeSource = {RelativeSource AncestorType = ListViewItem},Path = IsSelected}”/&gt;&#xA;& #xA;&lt; / ListView&gt;&#xA;  
&#xA;&#xA;

当然可以使用更合适的样式改进ListView(例如隐藏选择样式)。由于 SelectedValue 属性仅绑定到 Gender 属性,因此您将在ListView周围看到一个验证模板。

&# xA;&#xA;

我希望这是您正在寻找的结果。

&#xA;&#xA;

此外 - 使用该框架 - 我无法重现您的问题,因为如果我使用你的stackpanel并检查一个radiobutton,红色矩形都会消失。

&#xA;

答案 1 :(得分:1)

以下是在没有其他答案的框架的情况下执行此操作的方法(这很好,但不是必需的)。

关键是用另一个元素包围单选按钮,该元素具有对同一属性的绑定。这将显示错误。我为StackPanel的Tag属性设置了绑定,否则将不使用该绑定。

然后,您需要使用'Validation.ErrorTemplate =“ {x:Null}”“关闭每个单选按钮的验证错误模板。

<StackPanel Tag="{Binding Gender}" >
    <RadioButton IsChecked="{Binding Gender, 
        Converter={StaticResource GenderConverter},
        ConverterParameter={x:Static enumerations:Male}}" 
        Content="Male" Validation.ErrorTemplate="{x:Null}"/>
    <RadioButton IsChecked="{Binding Gender, 
        Converter={StaticResource GenderConverter},
        ConverterParameter={x:Static enumerations:Female}}" 
        Content="Female" Validation.ErrorTemplate="{x:Null}"/>
</StackPanel>