我需要使用IOobservable来跟踪对我的收藏的更改吗
本文关键字:收藏 我的 跟踪 IOobservable | 更新日期: 2023-09-27 18:21:15
阅读了很多关于IObservable的内容,我想知道在我的场景中,模式会给我带来什么(如果有的话)。
我有一个带有数据网格的WPF应用程序,该网格绑定到一个IObservable的Product集合。
ProductList.DataContext = AppState.Current.Products
其中AppState.Current.Products返回ObservableCollection<Product>
我的目标是:
- 跟踪已更改对象的列表
- 通知UI对象已更改,以便我可以启用保存按钮
我的产品类看起来像这样。。。
public class Product
{
string _desc;
public string Description
{
get { return _desc; }
set { _desc = value; }
}
}
现在,如果我更新网格上一行的描述列,就会调用Description
的setter。因此,我可以在这里预订一些代码,在我的产品上设置Dirty
标志,然后我可以使用它来查询需要持久化到DB的更改产品的列表。
我认为我可以使用IOobservable来实现我的第二个目标,即通知用户界面一行已经更改?或者有没有一种更简单的方法,比如网格上的一些属性?
如果我要使用IOobservable,我已经看到过产品公开可以订阅的事件的例子。但是,我不想将事件处理程序连接到我的所有对象。当集合中的任何对象发生更改时,我通常需要告诉我一些内容。
此外,我将如何将此通知连接到我的UI。
ObservableCollection<Something>
,尽管其名称与IOberservable<Something>
无关。它实现了INotifyCollectionChanged
和INotifyPropertyChanged
,这是WPF在绑定场景中寻找的接口。因此,如果在定义接口时在xaml中使用数据绑定,并绑定到ObservableCommection<Something>
,则在集合更改时会自动通知绑定,并且UI也会更新。你不需要在那里使用IOobservable。
不要误解我的意思,IOobservable是一个非常有用和强大的模式,尽管有点难以理解。就个人而言,我经常使用它。但这不是一个你应该使用它的情况。
接口INotifyPropertyChanged是在.Net框架中为类似任务实现的,根据MSDN Library:
INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。
如果我理解正确,你想要两件事。
1) 通过DataGrid 了解您的收藏中是否有任何更改
您的setter已经通过绑定被调用,因此您可以轻松地跟踪它。
2) 告诉UI已经进行了一些更改
我不确定保存按钮在UI中的位置,但无论它在哪里,你都可以简单地将它的enabled属性与布尔属性绑定。一旦检测到对象发生更改,请通过将bool属性值设置为true来启用该按钮。
我认为我可以使用IOobservable来实现我的第二个目标,即通知用户界面一行已经更改?
在这种情况下,不需要使用IOobservable。您已经绑定到ObservableCollection,这应该足够了。您只需要一个简单的绑定就可以告诉UI启用或禁用保存按钮