【问题标题】:Dynamically subscribe to events in a method?动态订阅方法中的事件?
【发布时间】: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();

【问题讨论】:

    标签: c# wpf delegates


    【解决方案1】:

    您可以将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
    }
    

    【讨论】:

    • 天哪。这看起来很容易,但我想我自己永远也想不通。非常感谢。
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多