ячейки сетки данных не обновляются при изменении свойств объекта в списке привязок

У меня есть приложение WPF с сеткой данных, ItemsSource которого является BindingList. Когда я вношу изменения в объекты в BindingList, сетка данных не обновляется. Как я могу убедиться, что сетка данных обновляется, когда я изменяю объект в BindingList?

Вот XAML:

<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Name="dgLocalPlugins" VerticalAlignment="Stretch" SelectionMode="Single" AlternatingRowBackground="#CDEBEBEB" Margin="5,85,5,143" Width="Auto" SelectionChanged="dgLocalPlugins_SelectionChanged">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Enabled" Binding="{Binding Path=Enabled}" Width="55" >
            <DataGridCheckBoxColumn.CellStyle>
                <Style>
                    <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
                    <EventSetter Event="CheckBox.Unchecked" Handler="OnUnchecked"/>
                </Style>
            </DataGridCheckBoxColumn.CellStyle>
        </DataGridCheckBoxColumn>
        <DataGridTextColumn Header="Plugin" Binding="{Binding Path=Type}" IsReadOnly="True" Width="*" />
        <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" IsReadOnly="True" Width="*" />
    </DataGrid.Columns>
</DataGrid>

Вот соответствующий код, в котором я заполняю BindingList:

private BindingList<PluginDescription> pluginList = new BindingList<PluginDescription>();

foreach (string path in osapdFiles)
{
    if (!string.IsNullOrEmpty(path))
    {
        PluginDescription desc = PluginHelper.Deserialize(path);
        pluginList.Add(desc);
    }
}

dgLocalPlugins.ItemsSource = pluginList;

Вот класс PluginDescription:

public class PluginDescription : INotifyPropertyChanged 
{
    private string _pluginName;
    public string Name
    {
        set
        {
            if (value != this._pluginName)
            {
                this._pluginName = value;
                NotifyPropertyChanged("Name");
            }
        }
        get { return _pluginName; }
    }

    private string _pluginType;
    public string Type
    {
        set
        {
            if (value != this._pluginType)
            {
                this._pluginType = value;
                NotifyPropertyChanged("Type");
            }
        }
        get { return _pluginType; }
    }

    private string _pluginVersion;
    public string Version
    {
        set
        {
            if (value != this._pluginVersion)
            {
                this._pluginVersion = value;
                NotifyPropertyChanged("Version");
            }
        }
        get { return _pluginVersion; }
    }

    private string _pluginAuthor;
    public string Author
    {
        set
        {
            if (value != this._pluginAuthor)
            {
                this._pluginAuthor = value;
                NotifyPropertyChanged("Author");
            }
        }
        get { return _pluginAuthor; }
    }

    private string _wikiUrl;
    public string WikiUrl
    {
        set
        {
            if (value != this._wikiUrl)
            {
                this._wikiUrl = value;
                NotifyPropertyChanged("Wiki");
            }
        }
        get { return _wikiUrl; }
    }

    private string _description;
    public string Description
    {
        set
        {
            if (value != this._description)
            {
                this._description = value;
                NotifyPropertyChanged("Description");
            }
        }
        get { return _description; }
    }

    private string _status;
    public string Status
    {
        set
        {
            if (value != this._status)
            {
                this._status = value;
                NotifyPropertyChanged("Statua");
            }
        }
        get { return _status; }
    }

    private bool _enabled;
    public bool Enabled
    {
        set
        {
            if (value != this._enabled)
            {
                this._enabled = value;
                NotifyPropertyChanged("Enabled");
            }
        }
        get { return _enabled; }
    }

    private string _upgrade;
    public string Upgrade
    {
        set
        {
            if (value != this._upgrade)
            {
                this._upgrade = value;
                NotifyPropertyChanged("Upgrade");
            }
        }
        get { return _upgrade; }
    }

    private string _path;
    public string Path
    {
        set
        {
            if (value != this._path)
            {
                this._path = value;
                NotifyPropertyChanged("Path");
            }
        }
        get { return _path; }
    }

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

}

Теперь, когда я изменяю свойство одного из объектов PluginDescription, DataGrid не обновляется. Я думал, что реализация интерфейса INotifyPropertyChange в классе PluginDescription — это все, что мне нужно. Нужно ли мне делать что-то еще?


person Brian    schedule 21.01.2012    source источник


Ответы (2)


Событие PropertyChanged должно быть снабжено точным названием вашей собственности. В вашем коде есть некоторые несоответствия: свойство WikiUrl вызывает событие PropertyChanged с "Wiki", а свойство Status с "Statua". Попробуйте исправить их в первую очередь.

Если это все еще не работает, не могли бы вы указать, какие свойства вы пытаетесь изменить?

person Douglas    schedule 21.01.2012
comment
Спасибо. Не могу поверить, что пропустил эту опечатку. Кажется, теперь работает так, как ожидалось. - person Brian; 21.01.2012

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

Обратите внимание, что это приводит к некоторому снижению производительности, кто-то описал это здесь: http://blog.quantumbitdesigns.com/2010/01/26/mvvm-lambda-vs-inotifypropertychanged-vs-dependencyobject/

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

person doblak    schedule 22.01.2012