Проверка зависимых данных 4 комбинированных списков одновременно c# - PullRequest
0 голосов
/ 18 февраля 2020

Я изучаю MVVM C# с WPF, и мне нужно проверить 4 поля со списком одновременно. Логика c заключается в том, что выборки должны относиться к одному и тому же типу объявлений (2 свойства объектов, которые заполняют эти списки). Проблема заключается в том, что они должны оцениваться вместе, и я получаю сообщения с этого сайта, MSDN и даже курсы udemy, где я не смог найти ответ на эти вопросы.

Во-первых, где я должен поставить свой код оценки? В настоящее время код находится в файле ViewModel для окна, которое я построил. Фрагмент этого проверочного кода говорит следующее:

    //Temperature Check
    private void CheckTemperature()
    { 
      if (Temperature < -273.15)
      {
        MessageBox.Show("You can't use temperatures below 0ºK", "It's freezing");
        Temperature = -273.15;
      }
      else if (Temperature > 100)
      {
        MessageBox.Show("Surface temperature can't be that hot", "Hotter than hell");
        Temperature = 100;
      }
      CanObtainHarm();
    }

И он выполняется каждый раз, когда ...

private double _temperature;

    public double Temperature
    {
      get { return _temperature; }
      set { 
        _temperature = value;
        CheckTemperature();
        OnPropertyChanged("Temperature");
      }
    }

Мой здравый смысл говорит мне, что это не то место, где этого кода проверки. Для этого примера я сделаю это правилом валидации, но случай 4 комбо-боксов, которые должны быть проверены, и если они установлены неправильно, их следует оставить пустыми, сводит меня с ума. Так как я не нашел, как я могу проверить ввод ComboBox пользователя и оставил его недействительным, если он недействителен, я отчаянно перепрыгиваю с видео на пост. Дополнительная информация: нет кнопки для нажатия кнопки проверки, она должна выполняться каждый раз, когда значение этих комбинированных списков изменяется

1 Ответ

0 голосов
/ 18 февраля 2020

я выполняю эту задачу следующим образом:

  • Проверка зависимых данных 4 комбинированных списков одновременно c#
  • при изменении любого из этих 4 свойств, запустите некоторую логику проверки c
  • для свойства изменено, если propertyName = один из 4, запустите некоторые логи проверки c
  • INotifyPropertyChanged.PropertyChanged, оператор switch, логи проверки c

поэтому где-то, где у нас есть ссылка на нашу модель представления, нам нужно добавить обработчик события к его событию PropertyChanged, чтобы проверить, что имя свойства является одним из 4, и, если это так, запустить некоторую логику проверки c.

, учитывая, что наша модель представления является свойством зависимости в нашем представлении, я бы связал все это в событии Loaded представления.

ANotifyPropertyChanged - базовая реализация для всех наших моделей представления

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace SO60283924
{
    public abstract class ANotifyPropertyChanged : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void SetProperty<T>(ref T backingStore, T newValue, [CallerMemberName] string propertyName = "")
        {
            var areEqual = ReferenceEquals(backingStore, newValue);
            if (areEqual)
                return;
            backingStore = newValue;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

SomeViewModel - модель представления с 5 свойствами, 4 из которых мы хотим проверить вместе

namespace SO60283924
{
    public class SomeViewModel : ANotifyPropertyChanged
    {
        private string someString;
        private int someInt;
        private object someObject;
        private decimal someDecimal;
        private object somePropertyNotPartOfValidation;

        public string SomeString { get => someString; set => SetProperty(ref someString, value); }
        public int SomeInt { get => someInt; set => SetProperty(ref someInt, value); }
        public object SomeObject { get => someObject; set => SetProperty(ref someObject, value); }
        public decimal SomeDecimal { get => someDecimal; set => SetProperty(ref someDecimal, value); }
        public object SomePropertyNotPartOfValidation { get => somePropertyNotPartOfValidation; set => SetProperty(ref somePropertyNotPartOfValidation, value); }
    }
}

MainWindow - представление для некоторой модели представления

* 10 24 *

Код MainWindow - где мы добавляем обработчик измененного свойства с проверкой logi c

using System.Windows;

namespace SO60283924
{
    public partial class MainWindow : Window
    {
        public SomeViewModel SomeViewModel
        {
            get { return (SomeViewModel)GetValue(SomeViewModelProperty); }
            set { SetValue(SomeViewModelProperty, value); }
        }
        public static readonly DependencyProperty SomeViewModelProperty =
            DependencyProperty.Register(nameof(SomeViewModel), typeof(SomeViewModel), typeof(MainWindow), new PropertyMetadata(new SomeViewModel()));
        public MainWindow()
        {
            InitializeComponent();
        }
        void Window_Loaded(object sender, RoutedEventArgs e)
        {
            SomeViewModel.PropertyChanged += (_, propertyChangedEventArgs) =>
            {
                switch (propertyChangedEventArgs.PropertyName)
                {
                    case nameof(SomeViewModel.SomeDecimal):
                    case nameof(SomeViewModel.SomeInt):
                    case nameof(SomeViewModel.SomeObject):
                    case nameof(SomeViewModel.SomeString):
                        //TODO add validation code
                        break;
                }
            };
        }
    }
}

, это достигает нашей цели: при изменении свойства, если изменилось одно из наших 4 свойств, запустите некоторые логи проверки c.

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