gpt4 book ai didi

c# - 实现 BindingList

转载 作者:行者123 更新时间:2023-11-30 18:08:59 25 4
gpt4 key购买 nike

我正在尝试了解更多有关 BindingList 的信息,因为我相信它会对我正在进行的项目有所帮助。

目前,我有一个对象类 (ScannedImage),它是类 (HashedImage) 的子类型,该类是原生 .Net 对象 (Image) 的子类型。我没有理由不能将这两个亚型一起移动。我只是对我之前构造的对象进行子类型化,但我现在将我的 ScannedImage 对象存储在 RDB 中(好吧,不是技术上的——只有细节,可能还有缩略图)。

此外,对象类的成员类型是我自己的自定义类型(关键字)。我正在使用自定义 datagridview 来呈现这些对象,但我正在使用我自己的代码处理对 ScannedImage 对象的所有更改。正如您可能想象的那样,我有很多事件要处理,这些事件发生在这些基本类型中。

那么,如果我更改对象以实现 INotifyPropertyChanged,对象集合(实现 BindingList)是否会收到 ScannedImage 对象更改的通知?

此外,如果关键字要实现 INotifyPropertyChanged,BindingList 是否可以通过 ScannedImage 对象访问更改?

抱歉,如果这看起来很新。我最近才发现 BindingList 并且没有接受过 C# 编程方面的正式培训 - 我很难在这方面取得进展。

此外,如果有人有任何好的引用资料,我将不胜感激。显然,我已经仔细阅读了 MSDN 库。我在网上找到了一些不错的链接,但现在似乎很多人都在使用 WPF 和 ObservableCollection。

我的项目是基于Winforms和.Net3.5框架。

TIA

最佳答案

我会回答你的两个问题:

[I]f I changed my object to implement INotifyPropertyChanged, would the object collection (implementing BindingList) receive notifications of changes to the ScannedImage object?

如果你实际使用 BindingList<T> 里面的类System.ComponentModel ,那么它确实包含用于插入 INotifyPropertyChanged 的元素的特殊情况代码.该列表看到属性更改并发送通知。

但是,您特别询问了“实现 BindingList”,这有细微的不同。您不能实现一个类。但是有一个接口(interface), IBindingList ,您可以用自己的类实现,如果这是您选择的路线,那么在编写列表类时您有责任确保监控属性更改通知。

通常您不需要创建自己的 IBindingList执行;只需使用 BindingList<T>包装一个现有的列表,你会没事的。

Also, if Keywords were to implement INotifyPropertyChanged, would changes be accessible to the BindingList through the ScannedImage object?

不,他们不会。 BindingList<T>仅查看列表中的特定对象,它无法扫描所有依赖项并监 View 中的所有内容(如果可能的话,这也不是一个好主意)。

如果你想收到通知,你必须做的是更新你的 ScannedImage用于检查来自 Keywords 的属性更改通知的类对象,然后触发它自己的 PropertyChanged响应事件。

例子:

public class ScannedImage : INotifyPropertyChanged
{
private Keywords keywords;

protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
PropertyChangedEventArgs e = new
PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}

private void KeywordsChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("Keywords");
}

private void SetKeywords(Keywords newKeywords)
{
Keywords oldKeywords = this.keywords;
this.keywords = null;
if (oldKeywords != null)
oldKeywords.PropertyChanged -= KeywordsChanged;
this.keywords = newKeywords;
if (newKeywords != null)
newKeywords.PropertyChanged += KeywordsChanged;
}

public Keywords Keywords
{
get { return keywords; }
set { SetKeywords(value); }
}

public event PropertyChangedEventHandler PropertyChanged;
}

public class Keywords : INotfifyPropertyChanged { ... }

我希望你明白这里正在做什么。业主,ScannedImage , 自动 Hook PropertyChanged来自其内部的事件 Keywords类并引发一个单独的属性更改事件,表示 Keywords已改变。这样,绑定(bind)列表和其他数据绑定(bind)控件在关键字更改时收到通知。

关于c# - 实现 BindingList<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2799181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com