Silverlight4 + C#:在UserControl中使用INotifyPropertyChanged来通知另一个UserControl没有通知

时间:2010-05-16 04:25:19

标签: c# silverlight user-controls inotifypropertychanged

我在项目中有几个用户控件,其中一个从XML检索项目,创建“ClassItem”类型的对象,并应该通知其他UserControl有关这些项的信息。

我为我的对象创建了一个类(所有项目都将具有“模型”):

public class ClassItem
{
    public int Id { get; set; }
    public string Type { get; set; }
}

我有另一个类,用于在创建“ClassItem”类型的对象时通知其他用户控件:

public class Class2: INotifyPropertyChanged
{
    // Properties
    public ObservableCollection<ClassItem> ItemsCollection { get; internal set; }

    // Events
    public event PropertyChangedEventHandler PropertyChanged;

    // Methods
    public void ShowItems()
    {
        ItemsCollection = new ObservableCollection<ClassItem>();

        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("ItemsCollection"));
        }
    }
}

数据来自XML文件,该文件被解析以创建ClassItem类型的对象:

void DisplayItems(string xmlContent)
    {
        XDocument xmlItems = XDocument.Parse(xmlContent);

        var items = from item in xmlItems.Descendants("item")
                    select new ClassItem{
                        Id = (int)item.Element("id"),
                        Type = (string)item.Element("type)                            
                    };

    }

如果我没弄错的话,这应该解析xml并为它在XML中找到的每个项创建一个ClassItem对象。因此,每次创建新的ClassItem对象时,都应该触发“绑定”到Class2中定义的“ItemsCollection”通知的所有UserControl的Notifications。

然而,Class2中的代码似乎没有运行:-(当然没有通知......

我在做过的任何假设中都错了,或者我错过了什么?任何帮助将不胜感激!

THX!

1 个答案:

答案 0 :(得分:1)

必须访问该属性才能使通知生效。我没有在代码中看到您为“ItemsCollection”设置值的任何位置。

我通常遵循这种模式:

  public ObservableCollection<ClassItem> ItemsCollection
        {
            get
            {
                return _itemsCollection;
            }
            set
            {
                _itemsCollection= value;
                NotifyPropertyChanged("ItemsCollection");
            }
        }

然后更新ItemsCollection。

    //before using the ObservableCollection instantiate it.
    ItemsCollection= new ObservableCollection<ClassItem>();

    //Then build up your data however you need to.
    var resultData = GetData();

    //Update the ObservableCollection property which will send notification
    foreach (var classItem in resultData)
    {
        ItemsCollection.Add(classItem);
    }