C# 动态订阅方法中的事件? 介绍
在我当前的WPF项目中,我经常需要将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
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)
{
//做点什么
}
天哪。这看起来很容易,但我想我自己永远也不会明白。非常感谢,天哪。这看起来很容易,但我想我自己永远也不会明白。非常感谢你。