我是否需要使用IObservable来跟踪对我的收藏集的更改?

时间:2012-01-22 12:13:48

标签: c# wpf wpfdatagrid system.reactive

阅读了很多关于IObservable的内容,我想知道在我的场景中该模式会给我什么(如果有的话)。

我有一个带有数据网格的WPF应用程序,网格绑定到一个IObservable产品集合。

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标志,然后我可以用它来查询需要保存到数据库的已更改产品列表。

我认为我可以使用IObservable来实现我的第二个目标,即通知用户界面一行已被更改?或者是否有更简单的方法,例如网格上的某些属性?

如果我要使用IObservable,我已经看到了产品公开可以订阅的事件的示例。但是,我不想将事件处理程序连接到我的所有对象。当集合中的任何对象发生变化时,我需要一些能够告诉我的东西。

此外,我如何将此通知连接到我的UI。

3 个答案:

答案 0 :(得分:3)

ObservableCollection<Something>,尽管名称与IOberservable<Something>无关。它实现了INotifyCollectionChangedINotifyPropertyChanged,这些是WPF在绑定场景中寻找的接口。因此,如果您在定义界面时在xaml中使用数据绑定,并绑定到ObservableCommection<Something>,则在集合更改时将自动通知绑定,并且UI将更新。你不需要在那里使用IObservable。

不要误解我的意思,IObservable是一个非常有用且非常强大的模式,如果有点难以理解的话。个人而言,我经常使用它。但这不是你应该使用它的情况。

答案 1 :(得分:0)

根据MSDN Library,接口INotifyPropertyChanged在.Net框架中实现了类似的任务:

  

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

答案 2 :(得分:0)

如果我理解正确你想做两件事。

  

1)确定您的收藏是否通过DataGrid进行了任何更改

您的setter已经通过绑定调用,因此您可以轻松跟踪它。

  

2)告诉用户界面已经做了一些更改

我不确定UI中存在哪个保存按钮,但无论如何,您只需将其启用的属性与布尔属性绑定即可。只要检测到对象发生更改,请通过将bool属性值设置为true来启用该按钮。

  

我认为我可以使用IObservable来实现我的第二个目标,即告知用户界面一行已被更改?

在这种情况下无需使用IObservable。您已经绑定到ObservableCollection应该足够了。您只需要一个简单的绑定来告诉UI有关启用或禁用“保存”按钮的信息