我真的不确定怎么说这个,所以这里就是。
我的WPF应用程序中的表单上有一些单选按钮已经过验证。它们基本上是此表单的必填字段。
当我开始填写表格时,两个单选按钮都标有红色边框,但是当我选择其中一个按钮时。发生这种情况:
我该如何解决这个问题?我知道我可以将控件更改为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;
}
答案 0 :(得分:2)
在我看来,你有两个解决方案:第一个 - 最简单的一个 - 是为 Gender
属性设置默认值。通过这种方式,将检查两个单选按钮中的一个,并且始终满足“required”属性。
第二个解决方案是将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;此外 - 使用该框架 - 我无法重现您的问题,因为如果我使用你的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>