Я использую WPF / XAML (первое кодирование с использованием этой технологии), и я пытаюсь отправить сообщение об ошибке, когда пользователь не выбрал ни один из параметров в поле со списком.
Это код на данный момент:
В моем бэкэнде я использую такой объект:
public class Scanner : ValidationBase
{
private int _id;
private string _name;
//[Range(1, int.MaxValue,ErrorMessageResourceType = typeof(Scanner), ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public int Id
{
get { return _id; }
set { SetProperty(ref _id, value); }
}
[Required(ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
}
А это моя ViewModel (для простоты я взял часть кода, которая не влияет на этот вопрос):
class ScannerSettingsViewModel : ModalViewModelBase, IScannerSettingsViewModel
{
private const string SCANNER_ID = "ScannerId";
private ObservableCollection<Scanner> _availableScanners;
private Scanner _scannerSelected;
public AwaitableDelegateCommand SaveCommand { get; private set; }
public AwaitableDelegateCommand CancelCommand { get; private set; }
[Required(ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public Scanner ScannerSelected
{
get { return _scannerSelected; }
set { SetProperty(ref _scannerSelected, value); }
}
public ObservableCollection<Scanner> AvailableScanners
{
get { return _availableScanners; }
set { SetProperty(ref _availableScanners, value); }
}
//Services
private readonly INavigationService _navigation;
private readonly ICheckDirectService _checkDirectService;
private readonly ISession _session;
public ScannerSettingsViewModel(INavigationService navigation, ISession session,
ICheckDirectService checkDirectService)
{
_navigation = navigation;
_session = session;
_checkDirectService = checkDirectService;
SaveCommand = new AwaitableDelegateCommand(SaveCommand_Execute);
CancelCommand = new AwaitableDelegateCommand(CancelCommand_Execute);
}
private async Task SaveCommand_Execute()
{
await ScannerSelected.FireValidation();
if (ScannerSelected.HasErrors)
{
return;
}
_session.Computer.Settings[SCANNER_ID] = ScannerSelected.Id.ToString();
await _session.Computer.Settings.SaveChanges();
await CloseDialog();
}
}
А это мой XAML (опять же, для простоты я взял только ту часть, которая соответствует вопросу):
<ComboBox Grid.Row ="1" ItemsSource="{Binding AvailableScanners}"
SelectedItem="{Binding ScannerConfigurationInfo.ScannerSetting, Mode=TwoWay, ValidatesOnDataErrors=True}"
SelectedValue="{Binding ScannerConfigurationInfo.ScannerSetting.Name, Mode=TwoWay, ValidatesOnDataErrors=True}"
Margin="20 50 20 50"
md:HintAssist.Hint="{l:LocText ScannerConfiguration_Model}"
DisplayMemberPath="Name"
SelectedValuePath="Name"
Style="{DynamicResource ComboboxDynamic}">
</ComboBox>
Таким образом, в выпадающем списке не будет выбран ни один параметр по умолчанию (это предполагается), и идея состоит в том, что есть кнопка сохранения, которая запускает метод SaveCommand_Execute
, который приводит к ошибке в .HasErrors
, но не "рисует" на передней части.