我在项目中有几个用户控件,其中一个从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!
答案 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);
}