編輯:爲了有效展平,CompositeCollection
對我來說非常有用。
我會使用value converter,那麼你的綁定源可以保持不變。
編輯:轉換器可能會看起來像這樣(未經測試!):
[ValueConversion(typeof(ObservableCollection<Node>), typeof(List<Node>))]
public class ObservableCollectionToListConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ObservableCollection<Node> input = (ObservableCollection<Node>)value;
int targetLevel = int.Parse(parameter as string);
List<Node> output = new List<Node>();
foreach (Node node in input)
{
List<Node> tempNodes = new List<Node>();
for (int level = 0; level < targetLevel; level++)
{
Node[] tempNodesArray = tempNodes.ToArray();
tempNodes.Clear();
foreach (Node subnode in tempNodesArray)
{
if (subnode.Children != null) tempNodes.AddRange(subnode.Children);
}
}
output.AddRange(tempNodes);
}
return output;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
你會在XAML中使用這樣的:
<Window.Resources>
...
<local:ObservableCollectionToListConverter x:Key="ObservableCollectionToListConverter"/>
</Window.Resources>
...
<ListView ItemsSource="{Binding MyNodes, Converter={StaticResource ObservableCollectionToListConverter}, ConverterParameter=3}">
(ConverterParameter
指定級別)
與其他兩個相同的問題,通過創建副本,我怎麼知道何時創建副本,每次添加或刪除節點?那麼當添加1000個節點時,綁定將被更新1000次,調用轉換器1000次,創建所有節點的新副本999不必要的時間 – markmnl 2011-02-17 01:07:21
那麼,我個人不會處理這些問題,直到它實際上*成爲一個問題的表現。你可以添加一個布爾屬性到轉換器打開或關閉。我懷疑有沒有更簡單的方法來做這樣的事情,你可能可以改進某些領域,但最終你的產品將永遠是一個由合併列表組成的列表。 – 2011-02-17 01:34:52
對不起,但是創建了一個999次列表的新副本,並且僅當添加1000個項目並且僅使用創建的第1000個副本時纔會處理該副本是不可接受的 - 我可以有超過1000個項目。打開和關閉轉換器不是一種選擇,因爲我不知道可能要添加多少物品。順便說一下,我傾向於僅使用轉換器設計的轉換器:在不同類型的目標和源之間轉換對象,如果從方法填充,最好使用ObjectDataProvider。 – markmnl 2011-02-17 02:07:41