首页 > 解决方案 > 动态订阅方法中的事件?

问题描述

介绍

在我当前的 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;
    }
}

为几十个列表分配几十个属性非常烦人,所以我在 Google 上搜索了一下,发现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();

标签: c#wpfdelegates

解决方案


您可以将 a 传递给您的方法并使用以下语法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
}

推荐阅读