c# - 动态订阅方法中的事件?
问题描述
介绍
在我当前的 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();
解决方案
您可以将 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
}
推荐阅读
- tensorflow2.0 - Tensorflow 模型和 Tensorflow lite 模型应该输出相同的结果吗?
- javascript - 当我 PUT 单个值 ReactJS/NodeJs 时如何将旧值保存到 PUT
- javascript - 有没有办法找到浏览器的中心?
- reactjs - 打字稿:ts2307 找不到类型声明,甚至安装了@types/react
- docker - 如何在 Jenkins 中显示外部 URL 作为构建结果
- r - 如何在 sample.split 中使用对象作为因变量
- javascript - 如何在 Nodejs 中访问终端
- rust - 设计类型 MutexGuardRef
- jquery - laravel - 无法从模态获取数据ID
- r - 将 3D 数组转换为整洁的数据框?