WPF DataGrid.ItemSource - PullRequest
       6

WPF DataGrid.ItemSource

0 голосов
/ 11 июня 2009

Я передаю IEnumerable Collection в WPF DataGrid через свойство DataGrid.ItemSource. Но он не обновляет DataGrid, когда я пытаюсь изменить элементы коллекции в коде. Почему?

Ответы [ 3 ]

3 голосов
/ 11 июня 2009

Вам необходимо привязать к типу, который реализует интерфейс INotifyCollectionChanged, чтобы он предоставлял события, которые привязка данных может использовать для мониторинга, когда элементы добавляются или удаляются. Лучший тип для этого в WPF - ObservableCollection <>, в котором есть конструктор, который примет ваш IEnumerable:

ObservableCollection<string> collection = new ObservableCollection<string>(iEnumerableobject);
dataGrid.ItemSource = collection;
collection.Add("Wibble");

Будет корректно обновляться.


Из ваших комментариев к другому ответу похоже, что вам нужно вызвать вызов add из потока пользовательского интерфейса. Не зная вашего кода более подробно, я не знаю, зачем вам это делать, но давайте предположим, что вы получаете данные из службы в фоновом режиме:

private ObservableCollection<string> collection;

public void SetupBindings()
{
    collection = new ObservableCollection<string>(iEnumerableobject);
    dataGrid.ItemSource = collection;
    //off the top of my head, so I may have this line wrong
    ThreadPool.Queue(new ThreadWorkerItem(GetDataFromService));
}

public void GetDataFromService(object o)
{
     string newValue = _service.GetData();

     //if you try a call add here you will throw an exception
     //because you are not in the same thread that created the control
     //collection.Add(newValue);

     //instead you need to invoke on the Ui dispatcher
     if(Dispather.CurrentDispatcher.Thread != Thread.CurrentThread)
     { 
         Dispatcher.CurrentDispatcher.Invoke(() => AddValue(newValue));
     } 
}

public void AddValue(string value)
{
    //because this method was called through the dispatcher we can now add the item
    collection.Add(value);
}

Как я уже сказал, у меня нет IDE, поэтому он, вероятно, не скомпилируется, но укажет вам правильное направление.

В зависимости от того, какую именно задачу вы выполняете в фоновом режиме, могут быть более эффективные способы сделать это. Мой пример, приведенный выше, было бы намного проще реализовать с помощью backgroundworker , так что вы можете прочитать об этом тоже.

1 голос
/ 11 июня 2009

Вместо этого вам нужно использовать ObservableCollection. (Или создайте свой собственный класс, обертывающий коллекцию и реализуйте интерфейс INotifyPropertyChanged)

0 голосов
/ 20 сентября 2010

Вы также можете использовать коллекцию, которая реализует интерфейс INotifyCollectionChanged, если по какой-то причине вы не можете использовать ObservableCollection ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...