我需要使用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。

我需要使用IOobservable来跟踪对我的收藏的更改吗

ObservableCollection<Something>,尽管其名称与IOberservable<Something>无关。它实现了INotifyCollectionChangedINotifyPropertyChanged,这是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启用或禁用保存按钮