【发布时间】:2019-06-14 22:03:00
【问题描述】:
简介
在我当前的 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 上的 this quite handy answer 可以动态分配属性,从而减少了为此创建新列表:
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();
【问题讨论】: