Проблема с преобразователем Treeview - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть вид дерева wpf, связанный с коллекцией. Типовая коллекция имеет тип:

public Class A {
 public string Name {get; set}
 public ObservableCollection< B> Bs {get; set;}  
}

public Class B {  
  public ObservableCollection< C> Cs {get; set;}  
}

public Class C {
  public string Name {get; set;}
}

XAML:

<my:AConverter x:Key="AConverter"/>
<DataTemplate DataType="{x:Type C}">
 <TextBlock Text="{Binding Name}"/>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type A}" 
     ItemsSource="{Binding Converter={StaticResource AConverter}}">
 <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<treeView Grid.Row="0" ItemsSource="{Binding As}"/>

AConverter.cs:

public class AConverter: IValueConverter {

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

        if (value is A) {
            return (value as A).Bs.SelectMany(b => b.Cs);
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}

Ожидаемый результат: A-> C в виде дерева, а не B. Проблема здесь в том, что, когда мы добавляем новый C, преобразователь не вызывается, чтобы показать то же самое в иерархии дерева

1 Ответ

0 голосов
/ 10 декабря 2011

Вы теряете обновления, если применяете конвертер, который не возвращает наблюдаемую коллекцию [sic] . То, чего вы пытаетесь достичь, на самом деле немного болезненно, в основном вам нужно сгладить иерархию при сохранении обновлений, это можно сделать с помощью CompositeCollection в некоторой степени. например,

public class AConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var compositeCollection = new CompositeCollection();
        var a = (A)value;
        // React to changes of the Bs:
        a.Bs.CollectionChanged += (s, e) =>
            {
                switch (e.Action)
                {
                    case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
                        // ObservableCollection only ever manipulates one item, thus NewItems[0].
                        compositeCollection.Insert(e.NewStartingIndex, new CollectionContainer { Collection = ((B)e.NewItems[0]).Cs });
                        break;
                    case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
                        //TODO: Implement
                        break;
                    case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
                        //TODO: Implement
                        break;
                    case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
                        //TODO: Implement
                        break;
                    case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
                        //TODO: Implement
                        break;
                    default:
                        break;
                }
            };
        // Add the items for the current Bs:
        foreach (var item in a.Bs)
        {
            compositeCollection.Add(new CollectionContainer { Collection = item.Cs });
        }
        return compositeCollection;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Реализация других случаев зависит от вас, вставки, кажется, работают.

Лучшим решением может быть предоставление CompositeCollections на каждом уровне, потому что тогда они могут быть легко вложены, то есть вы можете добавить CollectionContainer с CompositeCollection в качестве источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...