Введение
В моем текущем проекте 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;
}
PropertyChanged:
public void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
//do something
}
Вопрос
Я бы предпочел подписаться на PropertyChanged-Event при создании списка, а не повторять лишнюю итерацию второй раз по всему списку.
Так какЕсть довольно много моделей, которые имеют собственные PropertyChanged-события, мне нужно подписать их динамически.
Есть ли ваy симулирует RelayCommand, например:
public RelayCommand(Action<T> execute, Predicate<T> canExecute)
{
m_execute = execute ?? throw new ArgumentNullException("execute");
m_canExecute = canExecute;
}
, чтобы сообщить моему ContVertToList-методу, какое событие он должен подсцибить, например:
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();