【问题标题】:Adding an item to a bound WPF ListBox将项目添加到绑定的 WPF 列表框
【发布时间】:2009-08-20 15:42:13
【问题描述】:

好的,这让我很头疼。我有一个 ListBox,我正在绑定到一个 linq 查询,如下所示:

    private IQueryable<Feed> _feeds;

    public IQueryable<Feed> Feeds
    {
        get
        {
            if (_feeds == null)
            {
                var feedsQuery = from f in _db.Feed orderby f.Title select f;
                _feeds = feedsQuery;
            }
            return _feeds;
        }
    }

    public Options()
    {
        InitializeComponent();
        this.DataContext = Feeds;
    }

(作为记录,我也尝试过 List,而不是 IQueryable)

一切都很好,我有一个数据绑定表单,允许您编辑记录,所有这些更改都可以正常工作,修改后的数据显示在列表中。

问题来自我添加一个项目。列表中没有显示任何内容。数据很好地进入数据库,但查看数据的唯一方法是关闭并重新启动我的应用程序。我以下面的代码为例:

        Feed feed = new Feed()
        {
            ID = Guid.NewGuid(),
            Url = "http://www.test.com",
            Title = "Test"
        };
        _db.Feed.InsertOnSubmit(feed);
        _db.SubmitChanges();
        _db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

(无论有没有 _db.Refresh 都不会发生)

发生了什么事?

【问题讨论】:

    标签: c# wpf linq listbox


    【解决方案1】:

    你做对了,你只需要使用ObservableCollection。这将通知 ListBox 列表中的任何更改并自动刷新它。

    来自 MSDN

    在许多情况下,您处理的数据 with 是对象的集合。为了 例如,数据中的一个常见场景 绑定是使用 ItemsControl 例如 ListBox、ListView 或 TreeView 显示集合 记录。

    附:你不需要数据库刷新

    【讨论】:

    • 使用 ObservableCollection 不足以解决问题,需要再次对数据库运行查询
    【解决方案2】:

    除非另有通知,否则ListBox 仅在其ItemsSource 上迭代一次。您的查询只运行一次。

    查询对象不知道数据库何时更改(Refresh 也无济于事;请参见下文)——这取决于您是否知道(或预期)并在适当的时间重新运行相关查询。

    Stan R 提到了ObservableCollection。这很好,但是仅将查询结果存储在ObservableCollection 中并不能解决问题,除非您在数据库更改时自己做一些工作来更新集合。这意味着重新运行查询并手动添加新项目并从集合中删除已删除的项目。 (您也可以重新运行查询并将整个结果设置回 ListBox,但这意味着将创建一组全新的项目——性能不是很好,而且可能由于其他原因不是您想要的。)

    顺便说一句,您对DataContext.Refresh 的调用可能没有按照您的想法进行。来自文档:

    此方法在乐观并发错误后很有用,可以将项目带入状态以进行另一次尝试。它更新对象的原始字段和属性的状态。

    【讨论】:

      【解决方案3】:

      好的。我不肯定这是 100% 使用 ObservableCollection 的正确方法,但这似乎有效:

       private ObservableCollection<Feed> _feeds;
              public ObservableCollection<Feed> Feeds
              {
                  get
                  {
                      if (_feeds == null)
                      {
                          var feedsQuery = from f in _db.Feed orderby f.Title select f;
                          _feeds = new ObservableCollection<Feed>();
                          foreach (var item in feedsQuery)
                          {
                              _feeds.Add(item);
                          }
                      }
                      return _feeds;
                  }
              }
      

      并添加我的项目:

      Feed feed = new Feed()
                  {
                      ID = Guid.NewGuid(),
                      Url = "http://www.test.com",
                      Title = "Test"
                  };
                  _db.Feed.InsertOnSubmit(feed);
                  _db.SubmitChanges();
                  // manually update the list
                  Feeds.Add(feed);
      

      我花了一点时间才发现我必须手动更新列表(感谢 Ben),但这一切似乎都有效。排序会很好,但我会担心另一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-18
        • 2015-04-04
        • 2017-10-28
        • 2014-06-09
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多