【问题标题】:get data from datalayer into observablecollection in View将数据从数据层获取到 View 中的 observablecollection
【发布时间】:2015-09-26 00:33:28
【问题描述】:

我从 DataLayer 类获取数据到 ViewModel,但它没有进入与视图中的列表框绑定的 observableCollection。

public class ViewModel : NotifyUIBase
{
    public ViewModel()
    {
         FindImageCommand = new RelayCommand(FindImage);
    }

    public ObservableCollection<Image> FindVisualReferences { get; set; }       
    public RelayCommand FindImageCommand { get; private set; }

    private void FindImage()
    {
         string SearchTerm = this.SearchBox;
         var dbFunctions = new DatabaseFunctions();
         FindVisualReferences = dbFunctions.FindVisualReferences(SearchTerm);
    }
}

我已经测试了FindVisualReferecences(SearchTerm) 方法,它提供了填充 observableCollection 所需的项目。 我还使用 View 测试了数据绑定,并且效果很好。

当我将方法放在构造函数中时, ObservableCollection 会被填充

  public ViewModel()
    {
         var dbFunctions = new DatabaseFunctions();
         FindVisualReferences = dbFunctions.FindVisualReferences(SearchTerm);
    }

但我需要在用户给出 FindImageCommand 时调用该方法。 我怎样才能使这项工作?说到编码,我真的是个菜鸟。

【问题讨论】:

  • 有什么问题?你没有执行 FindImageCommand 吗?
  • 如何激活命令?通过按钮或类似的东西?
  • 命令执行,我可以将数据放入 ViewModel,但不知何故,它没有到达 ViewModel 中的 ObservableCollection,尽管 FindImage 方法中的 FindVisualReferences 包含我需要的项目ObservableCollection 与视图绑定。

标签: c# wpf mvvm observablecollection


【解决方案1】:

您的问题是您使用 ObservableCollection 的新实例设置 FindVisualReference 属性,而不是从现有实例中添加和删除。

public ObservableCollection<Image> FindVisualReferences { get; set; }

private void FindImage()
{
     string SearchTerm = this.SearchBox;
     var dbFunctions = new DatabaseFunctions();
     FindVisualReferences.Clear();
     FindVisualReferences.AddRange(dbFunctions.FindVisualReferences(SearchTerm));
}

或者你可以像你一样做并设置属性

FindVisualReferences = dbFunctions.FindVisualReferences(SearchTerm); 

但为了使其正常工作,您必须引发 PropertyChanged 事件。

private ObservableCollection<Image> _findVisualReferences;
public ObservableCollection<Image> FindVisualReferences 
{ 
   get{ return _findVisualReferences;}
   set
   {
       _findVisualReferences = value;
       RaiseProperyChanged("FindVisualReferences");
   }
}

但是如果你这样做了,那么使用 ObservableCollection 并没有多大意义,所以只需使用 List 代替。

我的建议,将其设为只读属性(即仅 getter)并添加到其中。

private ObservableCollection<Image> _findVisualReferences;
public ObservableCollection<Image> FindVisualReferences 
{ 
   get
   {
       if(_findVisualReferences == null)
          _findVisualReferences = new ObservableCollection<Image>(); 
       return _findVisualReferences;
   }       
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多