阅读了很多关于IObservable的内容,我想知道在我的场景中该模式会给我什么(如果有的话)。
我有一个带有数据网格的WPF应用程序,网格绑定到一个IObservable产品集合。
ProductList.DataContext = AppState.Current.Products
... AppState.Current.Products返回ObservableCollection<Product>
我的目标是:
我的产品类看起来像这样...
public class Product
{
string _desc;
public string Description
{
get { return _desc; }
set { _desc = value; }
}
}
现在,如果我更新网格上某行的描述列,则会调用Description
的setter 。所以我可以在这里预订一些代码,在我的产品上设置一个Dirty
标志,然后我可以用它来查询需要保存到数据库的已更改产品列表。
我认为我可以使用IObservable来实现我的第二个目标,即通知用户界面一行已被更改?或者是否有更简单的方法,例如网格上的某些属性?
如果我要使用IObservable,我已经看到了产品公开可以订阅的事件的示例。但是,我不想将事件处理程序连接到我的所有对象。当集合中的任何对象发生变化时,我需要一些能够告诉我的东西。
此外,我如何将此通知连接到我的UI。
答案 0 :(得分:3)
ObservableCollection<Something>
,尽管名称与IOberservable<Something>
无关。它实现了INotifyCollectionChanged
和INotifyPropertyChanged
,这些是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有关启用或禁用“保存”按钮的信息