я выполняю эту задачу следующим образом:
- Проверка зависимых данных 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.