【问题标题】:Do I need to use IObservable to track changes to my collection?我是否需要使用 IObservable 来跟踪我的收藏的更改?
【发布时间】:2012-01-22 12:13:48
【问题描述】:

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

我有一个带有数据网格的 WPF 应用程序,该网格绑定到 Product 的 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,我已经看到了产品公开可订阅事件的示例。但是,我不想将事件处理程序连接到我的所有对象。当集合中的任何对象发生更改时,我需要一些东西来告诉我。

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

【问题讨论】:

标签: c# wpf wpfdatagrid system.reactive


【解决方案1】:

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

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

【讨论】:

  • 干杯 - 您能否提供一个适用于我的场景的绑定示例?
  • 在 MSDN 的 Data Binding Overview 中有很多例子:msdn.microsoft.com/en-us/library/…
  • 嗨,是的,但是我要绑定什么?我的网格,我的收藏?我希望在产品集合脏时启用的按钮只是 MainWindow.xaml 中的一个工具栏按钮。
【解决方案2】:

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

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

【讨论】:

  • 我认为这看起来是正确的方法。我认为数据网格可以自动使用这个界面,但是我如何让我的 UI 检测到什么时候发生了变化?
  • 我不在我的电脑上,但这是我之前收藏的 MSDN 的链接。 msdn.microsoft.com/en-us/library/ms743695.aspx
【解决方案3】:

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

1) 通过 DataGrid 查看您的集合中是否有任何更改

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

2) 告诉 UI 已经进行了一些更改

我不确定该保存按钮存在于 UI 中的什么位置,但无论它在哪里,您都可以简单地将它的启用属性与布尔属性绑定。一旦检测到对象发生变化,通过将 bool 属性值设置为 true 来启用按钮。

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

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

【讨论】:

  • 好的,谢谢您的信息。我的收藏中有什么可以绑定的吗?
  • 我不知道你的按钮在哪里
  • 它就在我的 MainWindow.xaml 的工具栏上。此主窗口还包含数据网格。
  • 然后简单地创建一个 bool 属性并将按钮启用属性与它绑定。无需在集合中添加该内容。您需要 INotifyPropertyChanged 来通知发生了变化
  • 嗨,我应该在哪里实现这个 bool 属性,我们称之为“ProductsChanged”。您能否提供一个简单的示例,因为我似乎对放置此属性的位置感到困惑。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
相关资源
最近更新 更多