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 を「クレジット カード」に戻しても、赤い境界線がまだ残っています。
どこかに更新プロパティがありませんか???