需要手动填充observablecollection到listview或任何可以显示数据的元素

时间:2015-01-07 08:39:17

标签: wpf xaml listview viewmodel observablecollection

正如问题所说,我坚持用我的内容填充数据容器(listview),希望有人能给我一个亮点!

这是我拥有的类(我的搜索框发送了一个我希望在数据库中找到的parcial名称,我的数据库上的查询填充并检索一个ObservableCollection,填充了他能找到的尽可能多的parcial,然后我想把它展示给我的列表视图,希望有人可以帮助我!提前致谢!)

public class LobbyUserViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private DbOperations.DbOperations db;
    private ObservableCollection<Person> persons;

    public LobbyUserViewModel()
    {
        persons = new ObservableCollection<Person>();
        db = new DbOperations.DbOperations();
        searchPersonCommand = new RelayCommand(SearchPerson, CanSearchPerson);            
    }

    public ICommand SearchPersonCommand
    {
        get { return searchPersonCommand; }
    }

    public bool CanSearchPerson(object obj)
    {
        if (SearchPersonBox != string.Empty)
            return true;
        return false;
    }

    public void SearchPerson(object obj)
    {
        Persons = db.DadosForSearchPerson(searchPerson);
        if (Persons != null)
        {
            foreach (var item in Persons)
            {
                MessageBox.Show(item.Name + " - " + item.Email);
                // This works, but I need these 2 items added on a listview
            }
        }
        else
        {
            MessageBox.Show("Noone found with that name");
        }
    }

    public string SearchPersonBox
    {
        get { return searchPerson.Name; }
        set
        {
            searchPerson.Name = value;
            OnPropertyChanged("SearchPerson");
        }
    }
    public ObservableCollection<Person> Persons
    {
        get { return persons; }
        set { persons = value; }
    }

2 个答案:

答案 0 :(得分:2)

您需要在Persons二传手中加注PropertyChanged。目前,ObservableCollection每次调用SearchPerson()时都会被替换,但由于您没有引发PropertyChanged,因此WPF无法知道它已被更改。

由于您每次都要更换集合,因此简单地使用List<T>可能更有效。只有在您要在现有集合中动态添加/删除/移动项目时才需要ObservableCollection<T>

答案 1 :(得分:1)

为GazTheDestroyer +1。没有OnPropertyChanged的解决方案就像:

public void SearchPerson(object obj)
{
    if(!CanSearchPerson(obj))
      return;

    Persons.Clear();
    var result = db.DadosForSearchPerson(searchPerson);
    if (result != null)
    {
        foreach (var item in result )
        {
            MessageBox.Show(item.Name + " - " + item.Email);
            // This works, but I need these 2 items added on a listview
            Persons.Add(item)
        }
    }
    else
    {
        MessageBox.Show("Noone found with that name");
    }
}

你的Xaml

<ListView ItemsSource="{Binding Persons}">
 <ListView.View>
  <GridView>
   <GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding Name}"  />
   <GridViewColumn Width="140" Header="Email" DisplayMemberBinding="{Binding Email}" />
   </GridView>
  </ListView.View>
 </ListView>