2016-07-16 10 views
1

次の2つのコンボボックスには、同様のアイテムリストが含まれています。 2つのコンボボックスは同じ値を持つことはできません。ここでWPF:2つのコンボボックスで同時にValidatorを実行します。

  <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; 
    } 
} 

それだけで、現在変更されている方のコンボボックス上で動作することを除いて期待通りに検証が動作します。たとえば、コンボボックスが同じ値を持つ場合、各ボックスは赤で輪郭が描かれます。私は最初のボックスを変更し、赤は削除されますが、赤は2番目のボックスに残ります。いずれかのコンボボックスが変更されたときに、両方のコンボボックスを検証する方法はありますか?

+0

Textがバインドされる 'Model'プロパティとは何ですか?それは 'FieldNameForOldEmpNo'と' FieldNameForOldCompany'ではないでしょうか? –

+0

SimpleMVVMを使用しているので、 'Model'はDataContextのコピーです。私は 'Model.FieldNameForOldEmpNo'と' Model.FieldNameForOldCompany'を試しましたが、違いはありませんでした。どのフィールドが変更されたかにかかわらず、バリデーターが起動する 'Model'の変更を聴いてみることを望んでいました。 – BrianKE

+0

いいえ、バインディングソースが変更された場合にのみ、検証ルールが起動されます。私は答えを投稿しました。それが役立つかどうかを見てください。 –

答えて

0

バインディングソースプロパティ 変更イベントで検証ルールが発生します。

実際のプロパティを指すように結合の変更プロパティ名:

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

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

そして、これらのプロパティの両方のセッターから、これだけでなく、他のプロパティのプロパティの変更を上げます対応する検証ルールが起動されることを示します。

関連する問題