2

EDIT明確にするために追加のコードを追加しています...

IDataErrorInfo エラー インジケーターを、最初に「折りたたみ」で作成され、次に DataTrigger で表示されるコントロールに表示する際に問題が発生しています。

ルックアップ値にバインドする ComboBox コントロールがあり、「Cash」、「Credit Card」、および「Check」の 3 つの行が表示されます。「CreditCardCode」と「CheckNumber」にそれぞれバインドする 2 つの TextBox コントロールがあります。

TextBox コントロールには、関連する ComboBox 値が選択されている場合にのみ表示されるように DataTrigger が設定されています。関連する TextBox に値がない場合、データ エラー ロジックはエラーを表示します。

コンボ ボックスとテキスト ボックスの XAML は次のとおりです。

<ComboBox IsEditable="False" 
          IsSynchronizedWithCurrentItem="False" 
          SelectedItem="{Binding Path=PaymentType}"
          ItemsSource="{Binding Source={StaticResource paymentTypeLookup}}"
          DisplayMemberPath="{Binding PaymentTypeCode}">
      <ItemsControl.ItemTemplate>
          <DataTemplate>
              <StackPanel Orientation="Horizontal">
                  <TextBlock Text="{Binding Path=PaymentTypeCode,
                                  ValidatesOnDataErrors=True}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ComboBox>

<TextBox Name="CCCodeText" 
    Text="{Binding CreditCardCode, ValidatesOnDataErrors=True, 
           ValidatesOnExceptions=True, NotifyOnValidationError=True}" >
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Setter Property="TextBox.Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=PaymentComboBox, 
                                       Path=SelectedItem.PaymentTypeCode}" 
                             Value="CC_SWIPE">
                    <Setter Property="TextBox.Visibility" 
                                      Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

PaymentType オブジェクトのコードは次のとおりです。

public virtual PaymentType PaymentType
{
    get { return _paymentType; }
    set
    {
        if (!ReferenceEquals(_paymentType, value))
        {
            var previousValue = _paymentType;
            _paymentType = value;
            FixupPaymentType(previousValue);
            NotifyPropertyChanged("PaymentType");
            OnPaymentTypeChanged(value);
        }
    }
}
private PaymentType _paymentType;

OnPaymentTypeChanged() 関数は次のとおりです。

void OnPaymentTypeChanged(PaymentType value)
{
    errors.Remove("CheckNumber"); //Avoid Dupes
    errors.Remove("CreditCardCode"); //Avoid Dupes

    if (this.PaymentType != null)
    {
        if (value.PaymentTypeCode == "CHECK" && 
           (this.CheckNumber == String.Empty || this.CheckNumber == null))
           errors.Add("CheckNumber", "Check Number required");

        else if (value.PaymentTypeCode == "CC_SWIPE" 
                 && (this.CreditCardCode == String.Empty || 
                     this.CreditCardCode == null))
            errors.Add("CreditCardCode", "Credit Card Code required");
    }
}

ウィンドウが最初に表示されたときに ComboBox が「クレジット カード」に設定されている場合 (および CCCodeText コントロールが表示されている場合)、デフォルトの赤い境界線が正常に表示されます。しかし、ComboBox の値を "Check" に変更すると、CheckTextBox コントロールが表示され、赤い境界線がなくなります。

ComboBox を「クレジット カード」に戻しても、赤い境界線がまだ残っています。

どこかに更新プロパティがありませんか???

4

0 に答える 0