Обязательные аннотации данных не работают с использованием XAML - PullRequest
0 голосов
/ 27 июня 2019

Я использую 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, но не "рисует" на передней части.

1 Ответ

0 голосов
/ 27 июня 2019

Проблема была на моем ComboBox в SelectedValue, SelectedItem.Они указывали на другое свойство вместо SelectedScanner, а на DisplayMemberPath и SelectedValuePath указывали на Name вместо Id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...