C# 动态订阅方法中的事件? 介绍

C# 动态订阅方法中的事件? 介绍,c#,wpf,delegates,C#,Wpf,Delegates,在我当前的WPF项目中,我经常需要将DataTables转换为模型类列表,如下所示: public void CreateExmapleModeList() { ExampleModels = new List<ExampleModel>(); foreach (DataRow row in tbl) { ExampleModel example = new ExampleModel { Name = r

在我当前的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;
    }
}
财产变更:

public void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
    //do something
}
问题: 我更愿意在创建列表时订阅PropertyChanged事件,而不是在整个列表中进行第二次冗余迭代

因为有很多模型都有自定义的PropertyChanged事件,所以我需要动态订阅它们

是否有类似于中继命令的方法,例如:

public RelayCommand(Action<T> execute, Predicate<T> canExecute)
{
    m_execute = execute ?? throw new ArgumentNullException("execute");
    m_canExecute = canExecute;

}
ExampleModels = ListConverter.ConvertToList<ExampleModel>(tbl, ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e));
public static List<T> ConvertToList<T>(DataTable dt, CustomPropertyChanged<S, E>) where T : TemplateModel

 // [...]
 objT.PropertyChanged = CustomPropertyChanged;
 return onjT;
 }).ToList();

您可以将
属性changedeventhandler
传递给您的方法,并使用
+=
语法将其连接起来:

public static List<T> ConvertToList<T>(DataTable dt, PropertyChangedEventHandler eventHandler) where T : INotifyPropertyChanged
{
    //...
    objT.PropertyChanged += eventHandler;
}
公共静态列表转换器列表(DataTable dt,PropertyChangedEventHandler eventHandler),其中T:INotifyPropertyChanged
{
//...
objT.PropertyChanged+=eventHandler;
}
用法:

var list = ConvertToList<YourType>(dataTable, ExampleModel_Propertychanged);
...
private void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
    //do something
}
var list=ConvertToList(数据表,示例模型\u属性更改);
...
private void ExampleModel\u Propertychanged(对象发送方,PropertyChangedEventArgs e)
{
//做点什么
}

您可以将
属性ChangedEventHandler
传递给您的方法,并使用
+=
语法将其连接起来:

public static List<T> ConvertToList<T>(DataTable dt, PropertyChangedEventHandler eventHandler) where T : INotifyPropertyChanged
{
    //...
    objT.PropertyChanged += eventHandler;
}
公共静态列表转换器列表(DataTable dt,PropertyChangedEventHandler eventHandler),其中T:INotifyPropertyChanged
{
//...
objT.PropertyChanged+=eventHandler;
}
用法:

var list = ConvertToList<YourType>(dataTable, ExampleModel_Propertychanged);
...
private void ExampleModel_Propertychanged(object sender, PropertyChangedEventArgs e)
{
    //do something
}
var list=ConvertToList(数据表,示例模型\u属性更改);
...
private void ExampleModel\u Propertychanged(对象发送方,PropertyChangedEventArgs e)
{
//做点什么
}

天哪。这看起来很容易,但我想我自己永远也不会明白。非常感谢,天哪。这看起来很容易,但我想我自己永远也不会明白。非常感谢你。