有没有人成功应用 INotifyDataErrorInfo 接口并绑定到 AutoCompleteBox。我已经尝试过了,但我没有得到任何回应。该控件不响应其他控件,即带有红色边框和警告工具提示。它也不会使 Validation Summary 控件显示错误。
我已经成功地设置了标准的 TextBoxes 和 DatePickers,它们的行为完全符合互联网上人们提供的许多示例。
如果为了我的屏幕的一致性有一个答案会很好,也因为我想简单地绑定到 INotifyDataErrorInfo 附带的 HasErrors 属性以在准备保存时启用一个按钮,我不能这样做没有额外的代码来检查这些框是否正确。
目前,我通过使用 MVVMLight EventToCommand 绑定和注册 LostFocus 事件来区别对待这些。
<sdk:AutoCompleteBox x:Name="TransferTypeTextBox" SelectedItem="{Binding Path=SelectedTransferType, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" ItemsSource="{Binding Path=TransferTypes}" IsTextCompletionEnabled="True" Grid.Row="1" Grid.Column="1" Margin="0,3" Width="238" HorizontalAlignment="Left" FontFamily="/PtrInput_Silverlight;component/Fonts/Fonts.zip#Calibri" FontSize="13.333">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cmd:EventToCommand Command="{Binding TransferTypeLostFocusCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</sdk:AutoCompleteBox>
然后在 ViewModel 中,我将 RoutedEventArgs.OriginalSource 转换为 TextBox 并像这样获取文本,防止用户离开框,除非它为空或匹配框列表中的项目:-
private void OnTransferTypeLostFocus(RoutedEventArgs e)
{
System.Windows.Controls.TextBox box = (System.Windows.Controls.TextBox)e.OriginalSource;
// If user inputs text but doesn't select one item, show message.
if (this.Ptr.TransferType == null && !string.IsNullOrEmpty(box.Text))
{
MessageBox.Show("That is not a valid entry for Transfer Type", "Transfer type", MessageBoxButton.OK);
box.Focus();
}
}