2012-01-22 96 views
1

读了很多关于IObservable的信息,我想知道在我的场景中,模式会给我什么(如果有的话)。我是否需要使用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确实被调用我的网更新行中的描述栏的制定者。所以我可以在这里预订一些代码,在我的产品上设置一个Dirty标志,然后我可以使用它来查询需要保留到数据库的已更改产品的列表。

我认为我可以使用IObservable来满足我的第二个目标,即通知用户界面一行已更改?还是有一个更简单的方法,如网格上的一些属性?

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

此外,我将如何将此通知连接到我的用户界面。

+0

你看了INotifyPropertyChanged? http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx – Lloyd

回答

0

接口INotifyPropertyChanged在类似的任务.net框架来实现,按MSDN库:

INotifyPropertyChanged接口用于通知客户,一般客户绑定,一个属性值发生了变化。

+0

我认为这看起来像正确的做法。我认为datagrid可以自动使用这个接口,但是如何让我的UI检测出什么事情发生了变化? – Remotec

+0

我不是在我的电脑,但继承人从MSDN我以前收藏的链接。 http://msdn.microsoft.com/en-us/library/ms743695.aspx – Lloyd

3

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

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

+0

干杯 - 你能提供一个可以在我的场景中工作的绑定的例子吗? – Remotec

+0

在MSDN的数据绑定概述中有很多示例:http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections – Falanwe

+0

嗨,是的,但是我绑定了什么?我的网格,我的收藏?当我收集的产品很脏时,我想要启用的按钮只是我的MainWindow.xaml中的一个工具栏按钮。 – Remotec

0

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

1)找出是否有

你制定者已经得到通过绑定叫,所以你可以轻松地跟踪,通过数据网格您的收藏中所做的任何更改。

2)告诉UI,一些已经作了修改

我不知道哪里是保存在用户界面中存在的按钮,但这里永远是你可以简单地将其绑定的Enabled属性与布尔属性。只要您检测到对象发生变化,请通过将bool属性值设置为true来启用该按钮。

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

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

+0

好的,谢谢你的信息。我可以绑定的收藏有什么吗? – Remotec

+0

我不知道你的按钮在哪里 –

+0

它只是在我的MainWindow.xaml上的工具栏上。这个主窗口还包含数据网格。 – Remotec