Rachel Lim のブログに従って、ビジネス ロジックの検証を実装しました。次のようにIsValidプロパティにバインドされたビューにトリガーを配置することを決定するまで、すべてが順調に進んでいました。
<ListBox ItemsSource="{Binding EdgedBoards}" SelectedItem="{Binding SelEdgedBoard, Mode=TwoWay}" DisplayMemberPath="Name">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="Focusable" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsValid}" Value="False">
<Setter Property="Focusable" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
問題は、バインドされたアイテムにエラー (SelEdgedBoard.IsValid == false) がある場合、トリガーが再評価するように通知されず、アイテムのフォーカス可能なプロパティが true のままになることです。
GetValidationError() が値を返す前に NotifyPropertyChanged("IsValid") を配置しようとしましたが、この方法でスタックオーバーフロー例外が発生します。
#region IsValid Property
public bool IsValid
{
get
{
return string.IsNullOrWhiteSpace(GetValidationError());
}
}
public string GetValidationError()
{
string error = null;
if (ValidatedProperties != null)
{
foreach (string s in ValidatedProperties)
{
error = GetValidationError(s);
if (!string.IsNullOrWhiteSpace(error))
{
break;
}
}
}
NotifyPropertyChanged("IsValid");
return error;
}
#endregion