简体   繁体   English

WPF PropertyChanged代码错误:无法实现'System.ComponentModel.INotifyPropertyChanged

[英]WPF PropertyChanged code error: cannot implement 'System.ComponentModel.INotifyPropertyChanged

i have this code: 我有此代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Collections.Specialized;
using System.Collections.ObjectModel;

namespace Bix
{
    public class SettingsDataObject
    {
        private int id;
        public int Id
        {
            get { return id; }
            set { id = value == 0 ? Db.GetNextSettingsId() : value; }
        }
        private string adminEmail; public string AdminEmail { 
            get { return adminEmail; } 
            set { adminEmail = value; } 
        }
        private int state; public int State { get { return state; } set { state = value == 0 ? 1 : value; } }

        public object[] GetArray()
        {
            return new object[] { id, adminEmail, state };
        }

        public SettingsDataObject()
        {

        }
    }

    public class SettingsUIObjects : ObservableCollection<SettingsUIObject>,INotifyPropertyChanged
    {
        protected override void InsertItem(int index, SettingsUIObject item)
        {
            base.InsertItem(index, item);

            // handle any EndEdit events relating to this item
            item.ItemEndEdit += new SettingsUIObject.ItemEndEditEventHandler(ItemEndEditHandler);
            item.PropertyChanged += new SettingsUIObject.PropertyChangedEventHandler(PropertyChanged);
        }

        public void ItemEndEditHandler(IEditableObject sender)
        {
            // simply forward any EndEdit events
            if (ItemEndEdit != null)
            {
                ItemEndEdit(sender);
            }
        }

        public event SettingsUIObject.ItemEndEditEventHandler ItemEndEdit;
        public event SettingsUIObject.PropertyChangedEventHandler PropertyChanged;
    }

    public class SettingsDataProvider
    {
        private DataAccessLayer dl;

        public SettingsDataProvider()
        {
            dl = new DataAccessLayer();
        }

        public SettingsUIObjects GetSettings()
        {
            try
            {
                SettingsUIObjects objs = new SettingsUIObjects();

                List<SettingsDataObject> objDataObjects = dl.GetSettings();
                foreach (SettingsDataObject obj in objDataObjects)
                {
                    objs.Add(new SettingsUIObject(obj));
                }

                objs.ItemEndEdit += new SettingsUIObject.ItemEndEditEventHandler(SettingsItemEndEdit);
                objs.CollectionChanged += new
                  NotifyCollectionChangedEventHandler(SettingsCollectionChanged);
                objs.PropertyChanged += new SettingsUIObject.PropertyChangedEventHandler(SettingsPropertyChanged);
                return objs;
            }
            catch (Exception) { return new SettingsUIObjects(); }
        }

        void SettingsItemEndEdit(IEditableObject sender)
        {
            SettingsUIObject obj = sender as SettingsUIObject;

            // use the data access layer to update the wrapped data object
            dl.UpdateSettings(obj.GetDataObject());
        }

        void SettingsPropertyChanged(INotifyPropertyChanged sender, PropertyChangedEventArgs e)
        {
            SettingsUIObject obj = sender as SettingsUIObject;

            // use the data access layer to update the wrapped data object
            dl.UpdateSettings(obj.GetDataObject());
        }

        void SettingsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (object item in e.OldItems)
                {
                    SettingsUIObject obj = item as SettingsUIObject;

                    // use the data access layer to delete the wrapped data object
                    dl.DeleteSettings(obj.GetDataObject());
                }
            }
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (object item in e.NewItems)
                {
                    SettingsUIObject obj = item as SettingsUIObject;

                    // use the data access layer to delete the wrapped data object
                    dl.UpdateSettings(obj.GetDataObject());
                }
            }
        }
    }

    public class SettingsUIObject : IEditableObject, INotifyPropertyChanged
    {
        private SettingsDataObject obj;
        public SettingsUIObject(SettingsDataObject o)
        {
            obj = o;
        }

        public SettingsDataObject GetDataObject()
        {
            return obj;
        }

        public int Id { get { return obj.Id; } set { obj.Id = value; } }
        public string AdminEmail { 
            get { return obj.AdminEmail; } 
            set { obj.AdminEmail = value; } 
        }

        public delegate void ItemEndEditEventHandler(IEditableObject sender);

        public event ItemEndEditEventHandler ItemEndEdit;

        #region IEditableObject Members

        public void BeginEdit() { }

        public void CancelEdit() { }

        public void EndEdit()
        {
            if (ItemEndEdit != null)
            {
                ItemEndEdit(this);
            }
        }

        #endregion

        public delegate void PropertyChangedEventHandler(INotifyPropertyChanged sender, PropertyChangedEventArgs e);
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

    }
}

and i keep getting the compile error: 而且我不断收到编译错误:

'Bix.SettingsUIObject' does not implement interface member 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged'. 'Bix.SettingsUIObject'未实现接口成员'System.ComponentModel.INotifyPropertyChanged.PropertyChanged'。 'Bix.SettingsUIObject.PropertyChanged' cannot implement 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' because it does not have the matching return type of 'System.ComponentModel.PropertyChangedEventHandler' 'Bix.SettingsUIObject.PropertyChanged'无法实现'System.ComponentModel.INotifyPropertyChanged.PropertyChanged',因为它没有匹配的返回类型'System.ComponentModel.PropertyChangedEventHandler'

can anyone tell me why? 谁能告诉我为什么?

thanks 谢谢

Orson 奥森

    public delegate void PropertyChangedEventHandler(INotifyPropertyChanged sender, PropertyChangedEventArgs e);
    public event PropertyChangedEventHandler PropertyChanged;

Your code redeclares a PropertyChangedEventHandler delegate, which hides the one declared in System.ComponentModel . 您的代码重新声明了PropertyChangedEventHandler委托,该委托隐藏了System.ComponentModel声明的委托。 So your event is of type SettingsUIObject.PropertyChangedEventHandler , not System.ComponentModel.PropertyChangedEventHandler . 因此,您的事件类型为SettingsUIObject.PropertyChangedEventHandler ,而不是System.ComponentModel.PropertyChangedEventHandler Since the type doesn't match the one declared in INotifyPropertyChanged , your PropertyChanged event doesn't a valid implementation of the interface. 由于类型与INotifyPropertyChanged声明的类型不匹配,因此PropertyChanged事件不是该接口的有效实现。

Just remove your PropertyChangedEventHandler delegate and it should work fine. 只需删除您的PropertyChangedEventHandler委托,它就可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 不实现接口成员&#39;System.ComponentModel.INotifyPropertyChanged.PropertyChanged&#39; - Does not implement interface member 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' 在WPF中的DataContext上实现INotifyPropertyChanged? - Implement INotifyPropertyChanged on DataContext in WPF? 当我在INotifyPropertyChanged上引发PropertyChanged事件时出错 - Error when I raised the PropertyChanged event on INotifyPropertyChanged WPF文本框未使用数据绑定,iNotifyPropertyChanged和PropertyChanged触发器更新 - WPF TextBox Not Updating with Data Binding, iNotifyPropertyChanged, and PropertyChanged Trigger 计时器错误“无法从'int'转换为'System.ComponentModel.IContainer'” - Error with a timer "cannot convert from 'int' to 'System.ComponentModel.IContainer'" WPF绑定失败,并为INotifyPropertyChanged.PropertyChanged自定义添加和删除访问器 - WPF binding fails with custom add and remove accessors for INotifyPropertyChanged.PropertyChanged INotifyPropertyChanged 不触发 PropertyChanged - INotifyPropertyChanged not firing PropertyChanged System.ComponentModel.InotifyPropertyChanging错误 - System.ComponentModel.InotifyPropertyChanging error PropertyChanged时INotifyPropertyChanged - INotifyPropertyChanged when PropertyChanged 没有行号的错误在模块System.dll中找不到类型System.ComponentModel.TypeDescriptionProvider - Error with no line number Cannot find type System.ComponentModel.TypeDescriptionProvider in module System.dll
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM