单选按钮验证
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>
我不太确定如何表达这个,所以就这样吧。
我的 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>