是否可以将事件附加到自定义集合,并在更改集合时修改ui



例如,我有一个名为Error的类,"Error"的属性包括ErrorMessage、ErrorCode等。当创建了Error的新实例时,该实例将添加到集合ErrorCollection:ICollection中。一旦添加了UI,是否可以更改它?如果是这样,如何在不引起线程问题的情况下做到这一点

注意:Error类的实例将以异步方式创建。

粗略的视觉示例:

public class ErrorCollection:ICollection<Error>
{
private readonly ICollection<Error> _collection = new Collection<Error>();
public EventArgs e = null;
public void Add(Error item)
{
_collection.Add(item);
if(AddEventHandler != null)
{
AddEventHandler(this, e);
}
}
public event EventHandler AddEventHandler;
public void OnAdd(object sender, EventArgs e)
{
//Do some more stuff here including updating UI
}
...
}
public class Error
{
public Error()
{                        
}
private Task<Error> InitializeErrorAsync()
{
return Task.Run(() =>
{
//Do some stuff that can take a while
Thread.Sleep(5000);
return this;
});            
}
public static async Task<Error> CreateError()
{
Error error = new Error();
return await error.InitializeErrorAsync();
}
}
public partial class MainWindow : Window
{
ErrorCollection errorCollection = new ErrorCollection();        
public MainWindow()
{
InitializeComponent();
errorCollection.AddEventHandler += new EventHandler(errorCollection.OnAdd);                        
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
errorCollection.Add(await Error.CreateError());            
}
}

编辑:让我也澄清一下,在我的例子中,我使用Error作为一个例子类。并不是说我不会用它来处理错误,但我正在寻找一个通用的解决方案。

有一个类可以通知视图模型,每当出现错误时,它还允许用户界面知道,然后它会更改与此相关的外观查看此帖子https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx

通过使用ObservableCollection而不是ICollection。ObservableCollection实现了INotifyCollectionChanged,它可以与ItemsSource组合使用,以便在集合自动更改时更新UI。正如克莱门斯指出的那样,没有必要利用事件来重塑这一点

最新更新