Как обновить свойство элемента ObservableCollection после изменения в WPF DataGrid? - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть WPF DataGrid, источником данных которого является ObservableCollection. Это настроено свободно как следующее:

public class ItemDataCollection : ObservableCollection<ItemData>
{
}

public class ItemData : INotifyPropertyChanged
{
    private bool _selected = true;
    public bool Selected 
    { 
        get
        {
            return _selected;
        }
        set
        {
            if (value != _selected)
            {
                _selected = value;
                NotifyPropertyChanged("Selected");
            }
        }
    }
    }


    _itemDataCol = new ItemDataCollection();
        <... fill the _itemDataCol with data here ...>
    dataGrid1.ItemsSource = _itemDataCol;

Когда коллекция обновляется, dataGrid1.Items.Refresh () корректно обновляет dataGrid1. Однако, когда я изменяю свойство «Выбрано» строки, устанавливая или снимая флажок в строке, соответствующей этому свойству, элемент в коллекции не обновляется. Я посмотрел на событие CollectionChanged ObeservableCollection, но это не похоже на срабатывание. Какая проводка мне нужна, чтобы получить dataGrid1 для обновления коллекции.

Обновление

Все, что я делал, это устанавливал свойство ItemSource в ObservableCollection и позволял автоматически генерировать столбцы. С тех пор я изменил привязку напрямую и нашел более подробную информацию о проблеме. Когда я просто устанавливаю флажок - уведомление не запускается. Однако, если я нажму после установки флажка, то коллекция будет обновлена. Вот привязка:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn>

Так что я думаю, вопрос в том, как мне получить обновление с необходимостью нажимать после установки или снятия флажка?

Обновление № 2 (Я не могу ответить, так как мой представитель еще недостаточно высок) ОК - думаю, у меня есть решение. Если я включу «UpdateSourceTrigger = PropertyChanged» в привязку, все, кажется, работает.

<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Selected"></DataGridCheckBoxColumn>

Пожалуйста, оставляйте комментарии, если есть какие-либо негативные последствия этого, которые я могу пропустить. Спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 03 апреля 2012

CollectionChanged предназначен для вставки и удаления.NotifyPropertyChanged для обновления элементов.В размещенном коде вы фактически не реализуете INotifyPropertyChanged.

   public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

И я думаю, что связывать с публичной собственностью, где вы возвращаете _itemDataCol

, будет чище, в противном случае ответ celopez3

на два пути
3 голосов
/ 03 апреля 2012

ObservableCollection не слушает события INotifyPropertyChanged своих предметов; используйте взамен BindingList.

Другими словами, [an ObservableCollection] только замечает, когда элементы добавляются или удаляются, но не когда значения его элементов изменяются, даже если эти элементы реализуют INotifyPropertyChanged. Для сравнения, BindingList слушает INotifyPropertyChanged, и, следовательно, если его элементы изменены, изменения будут отражены в сетке. В результате группировки, сортировки, и статистические функции будут обновлены.

http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

0 голосов
/ 04 апреля 2012

Ответ в том, что мне нужно было установить UpdateSourceTrigger на PropertyChanged (см. Ответ Блама).Двухстороннее связывание, похоже, не нужно указывать.Вот разметка из рабочего кода:

<DataGridCheckBoxColumn Binding="{Binding Path=Selected,
     UpdateSourceTrigger=PropertyChanged}" 
     Header="Selected"></DataGridCheckBoxColumn>
0 голосов
/ 03 апреля 2012

Я не уверен, что вы поместили достаточно информации в свой пост, но я постараюсь помочь. Один из моих первых вопросов: как вы привязываетесь к флажку? Следует отметить, что если вы хотите, чтобы флажок влиял на наблюдаемую коллекцию, вы должны установить «двустороннюю» привязку к элементу, по умолчанию привязка «односторонняя» и не будет автоматически изменять элемент в вашей коллекции. , Другой способ справиться с этим - добавить событие в флажок, чтобы при щелчке вы вручную изменяли значение в наблюдаемой коллекции.

...