【问题标题】:WPF: Run Validator on two comboboxes as the same timeWPF:同时在两个组合框上运行验证器
【发布时间】: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 属性是什么?不应该是FieldNameForOldEmpNoFieldNameForOldCompany吗?
  • 我使用的是 SimpleMVVM,所以Model 是 DataContext 的副本。我试过Model.FieldNameForOldEmpNoModel.FieldNameForOldCompany,但这似乎并没有什么不同。我希望通过监听Model 上的任何更改,验证器都会触发,无论哪个字段发生了更改。
  • 不,只有在绑定源更改时才会触发验证规则。我已经发布了答案。看看有没有帮助。

标签: c# wpf validation combobox


【解决方案1】:

验证规则在绑定源属性上被触发 更改事件。

将绑定中的属性名称更改为指向实际属性:

<ComboBox.Text>
    <Binding Path="Model.FieldNameForOldEmpNo" 
             UpdateSourceTrigger="PropertyChanged">
        .....
</ComboBox.Text>

<ComboBox.Text>
    <Binding Path="Model.FieldNameForOldCompany" 
             UpdateSourceTrigger="PropertyChanged">
        .....
</ComboBox.Text>

并且从这两个属性的设置器中,引发其他属性的属性更改,以便触发其相应的验证规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多