В моем текущем проекте WPF мне довольно регулярно приходилось преобразовывать DataTables
в списки классов моделей, например:
public void CreateExmapleModeList()
{
ExampleModels = new List<ExampleModel>();
foreach (DataRow row in tbl)
{
ExampleModel example = new ExampleModel
{
Name = row["Name"].ToString(),
Tag = row["Tag"].ToString(),
Value = double.Parse(row["Value"].ToString()),
// [...]
};
ExampleModels.Add(example);
example.PropertyChanged += ExampleModel_PropertyChanged;
}
}
назначение десятков свойств для десятков списков довольно раздражает, поэтому я немного погуглил и нашел это довольно удобный ответ в StackOverflow для динамического назначения свойств, что сократило создание новых списков до этого:
ExampleModels = ListConverter.ConvertToList<ExampleModel>(tbl);
Теперь, после рефакторинга моего кода, я не знал, как подписать свое пользовательское событие PropertyChanged-Event на событие PropertyChanged-Event моей модели, поэтому я просто повторил весь список еще раз:
foreach (ExampleModel exmp in ExampleModels)
{
example.PropertyChanged += ExampleModel_PropertyChanged;
}
Свойство изменено:
public void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
//do something
}
Я бы предпочел подписаться на событие PropertyChanged-Event при создании списка, а не выполнять избыточную итерацию во второй раз по всему списку.
Поскольку существует довольно много моделей с пользовательскими событиями PropertyChanged-Events, мне нужно динамически подписывать их.
Есть ли способ, аналогичный RelayCommand, например:
public RelayCommand(Action<T> execute, Predicate<T> canExecute)
{
m_execute = execute ?? throw new ArgumentNullException("execute");
m_canExecute = canExecute;
}
чтобы сообщить моему ContVertToList-Method, какое событие он должен подписаться подобно:
ExampleModels = ListConverter.ConvertToList<ExampleModel>(tbl, ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e));
а в ConvertToList
что-то вроде этого:
public static List<T> ConvertToList<T>(DataTable dt, CustomPropertyChanged<S, E>) where T : TemplateModel
// [...]
objT.PropertyChanged = CustomPropertyChanged;
return onjT;
}).ToList();
Вы можете передать PropertyChangedEventHandler
своему методу и подключить его, используя синтаксис +=
:
public static List<T> ConvertToList<T>(DataTable dt, PropertyChangedEventHandler eventHandler) where T : INotifyPropertyChanged
{
//...
objT.PropertyChanged += eventHandler;
}
Применение:
var list = ConvertToList<YourType>(dataTable, ExampleModel_Propertychanged);
...
private void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
//do something
}
святая моль. Это выглядит так просто, но я думаю, что я бы никогда не понял это сам. Спасибо большое.