【发布时间】:2016-07-16 17:47:56
【问题描述】:
我有以下两个包含类似项目列表的组合框。两个组合框的值不能相同。
<ComboBox Name="OldEmpNoListBox"
IsReadOnly="True"
ItemsSource="{Binding OldEmpNoCollection}"
SelectedValue="{Binding Model.FieldNameForOldEmpNo, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
HorizontalAlignment="Left"
Width="150"
IsEnabled="{Binding HasItems, RelativeSource={RelativeSource Self}}"
Grid.Row="1" Grid.Column="1">
<ComboBox.Text>
<Binding Path="Model"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vm:FieldNamesValidator ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
<ComboBox Name="OldCompanyListBox"
IsReadOnly="True"
ItemsSource="{Binding OldCompanyCollection}"
SelectedValue="{Binding Model.FieldNameForOldCompany, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
HorizontalAlignment="Left"
Width="150"
Grid.Row="2" Grid.Column="1">
<ComboBox.Text>
<Binding Path="Model"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vm:FieldNamesValidator ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</ComboBox.Text>
</ComboBox>
这里是验证器:
/// <summary>
/// Duplicate Values Validator
/// </summary>
public class FieldNamesValidator : ValidationRule
{
/// <summary>
/// Validate OldEmpNo field name does not match Old Company field name
/// </summary>
/// <param name="value"></param>
/// <param name="cultureInfo"></param>
/// <returns></returns>
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
EmpNoOptionsSettingsModel _empNoOptions = (App.Current.Resources["Locator"] as ViewModelLocator).ParametersEmpNoOptionsViewModel.Model;
// if OldEmpNo field name = Old Company field name
if (_empNoOptions.FieldNameForOldEmpNo == _empNoOptions.FieldNameForOldCompany)
{
return new ValidationResult(false, "Field name for Old Emp No cannot be the same as the field name for Old Company");
}
return ValidationResult.ValidResult;
}
}
验证按预期工作,只是它只对当前正在更改的组合框进行操作。例如,如果组合框具有相同的值,则每个框都以红色标出。我更改了第一个框并删除了红色,但红色仍保留在第二个框上。有没有办法让两个组合框在其中一个更改时验证自己?
【问题讨论】:
-
Text 绑定到的
Model属性是什么?不应该是FieldNameForOldEmpNo和FieldNameForOldCompany吗? -
我使用的是 SimpleMVVM,所以
Model是 DataContext 的副本。我试过Model.FieldNameForOldEmpNo和Model.FieldNameForOldCompany,但这似乎并没有什么不同。我希望通过监听Model上的任何更改,验证器都会触发,无论哪个字段发生了更改。 -
不,只有在绑定源更改时才会触发验证规则。我已经发布了答案。看看有没有帮助。
标签: c# wpf validation combobox