Динамически подписываться на события в методе? - PullRequest
0 голосов
/ 14 июня 2019

Введение

В моем текущем проекте 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();

1 Ответ

2 голосов
/ 14 июня 2019

Вы можете передать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...