单选按钮验证

Validation on Radio Buttons

我不太确定如何表达这个,所以就这样吧。

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

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

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

我尝试让验证显示在包含单选按钮的堆栈面板上,但没有任何效果。

我真的无法为性别设置默认值,以防它被忽略并导致 complaint/misunderstanding 更进一步。

上图的 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>

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

当性别被 selected 时,验证边框只会从被点击的单选按钮中移除,而我真的认为两个边框都应该被移除作为数据绑定 属性现在有一个值。

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

编辑 2: This 问题修复了显示的边框,但随后隐藏了需要 selected 单选按钮之一的事实。有没有办法在 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 个解决方案:第一个 - 最简单的 - 是为 Gender 属性 设置默认值。这样,将检查两个单选按钮中的一个,并且将始终满足 "required" 属性。

第二种解决方案是"mask"一个ListView作为一个RadioButtonGroup。对于我的示例,我使用了一个非常直观的框架来通过使用属性来执行验证。你可以找到它 here.

所以,我没有使用堆栈面板,而是写了这篇 XAML:

<ListView SelectedValue="{Binding Gender, ValidatesOnDataErrors=True}"
            SelectedValuePath="Tag" BorderThickness="0" Margin="2" SelectionMode="Single">

    <RadioButton GroupName="Gender" Margin="2" Tag="M" Content="Male" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected}" />
    <RadioButton GroupName="Gender" Margin="2" Tag="F" Content="Female" IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected}" />

</ListView>

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

希望这就是您要找的结果。

此外 - 使用该框架 - 我无法重现您的问题,因为如果我使用您的堆栈面板并选中一个单选按钮,两个红色矩形都会消失。

这是在另一个答案中没有框架的情况下如何做到这一点(这很好但不是必需的)。

关键是用另一个元素包围单选按钮,该元素具有相同的绑定 属性。这将显示错误。我为 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>