如果我有一個使用composite design pattern的文件夾式結構,我將根文件夾綁定到TreeView
。如果我可以顯示從文件夾內容中累積的特定屬性,這將非常有用。問題是,我如何最好地通知該文件夾在子元素中發生更改,以便累積屬性得到更新?如何最好地向上傳播更改通知綁定的層次結構?
我需要的上下文是我正在嘗試製作的一個小型RSS-FeedReader。這是最重要的對象和我的模型方面:
複合接口:
public interface IFeedComposite : INotifyPropertyChanged
{
string Title { get; set; }
int UnreadFeedItemsCount { get; }
ObservableCollection<FeedItem> FeedItems { get; }
}
FeedComposite(又名文件夾)
public class FeedComposite : BindableObject, IFeedComposite
{
private string title = "";
public string Title
{
get { return title; }
set
{
title = value;
NotifyPropertyChanged("Title");
}
}
private ObservableCollection<IFeedComposite> children = new ObservableCollection<IFeedComposite>();
public ObservableCollection<IFeedComposite> Children
{
get { return children; }
set
{
children.Clear();
foreach (IFeedComposite item in value)
{
children.Add(item);
}
NotifyPropertyChanged("Children");
}
}
public FeedComposite() { }
public FeedComposite(string title)
{
Title = title;
}
public ObservableCollection<FeedItem> FeedItems
{
get
{
ObservableCollection<FeedItem> feedItems = new ObservableCollection<FeedItem>();
foreach (IFeedComposite child in Children)
{
foreach (FeedItem item in child.FeedItems)
{
feedItems.Add(item);
}
}
return feedItems;
}
}
public int UnreadFeedItemsCount
{
get
{
return (from i in FeedItems
where i.IsUnread
select i).Count();
}
}
飼料:
public class Feed : BindableObject, IFeedComposite
{
private string url = "";
public string Url
{
get { return url; }
set
{
url = value;
NotifyPropertyChanged("Url");
}
}
...
private ObservableCollection<FeedItem> feedItems = new ObservableCollection<FeedItem>();
public ObservableCollection<FeedItem> FeedItems
{
get { return feedItems; }
set
{
feedItems.Clear();
foreach (FeedItem item in value)
{
AddFeedItem(item);
}
NotifyPropertyChanged("Items");
}
}
public int UnreadFeedItemsCount
{
get
{
return (from i in FeedItems
where i.IsUnread
select i).Count();
}
}
public Feed() { }
public Feed(string url)
{
Url = url;
}
好吧,所以這裏是一件事,如果我綁定一個TextBlock.Text
到UnreadFeedItemsCount
不會有簡單的通知,當一個項目被標記爲未讀時,所以我的方法之一是處理每FeedItem
的PropertyChanged
事件,並且如果IsUnread
-屬性發生更改,我的Feed
會發出通知物業UnreadFeedItemsCount
已更改。有了這個方法,我還需要處理所有Feeds
和FeedComposites
Children
FeedComposite
的所有PropertyChanged
事件,從它的聲音中,應該很明顯,這不是一個非常好的想法,您需要非常小心,添加到任何集合中或從中刪除,而不必先附加PropertyChanged
事件處理程序。
另請參見:我該怎麼處理CollectionChanged
- 必然會導致未讀項目總數變化的事件數量?聽起來像更多的事件處理樂趣。
這是如此混亂;這將是巨大的,如果任何人有一個優雅的解決這一點,因爲我不希望飼料讀者最終成爲可怕的是我第一次嘗試年前,當時我甚至不知道數據綁定...
謝謝你的回答,你在這裏花了相當長的時間。現在我不能給你一個更長的迴應,我會嘗試儘快這樣做,只要我可以... – 2011-01-10 05:20:26