Проблема смешанного списка в многократном связывании древовидной структуры WPF - PullRequest
0 голосов
/ 18 октября 2010

Мне трудно решить эту простую проблему:

Я использую древовидную структуру с HierarichalDataTemplate, чтобы показать иерархию двух объектов: Organization и Unit.Организация имеет много-много-много отношения к себе, поскольку может иметь подорганизации.И каждая организация имеет отношение один-ко-многим с отделом, так как организация может содержать несколько подразделений.

Я успешно использую мультибиндинги с наблюдаемой коллекцией для заполнения дерева.Конвертер вызывается при инициализации, но я не могу заставить его снова вызываться.Поэтому, когда я добавляю какие-либо подразделения или организации, список не обновляется:

  <HierarchicalDataTemplate.ItemsSource>
      <MultiBinding Converter="{StaticResource TreeMultiValueConverter}">
          <Binding Path="ChildOrgs"/>
          <Binding Path="Units" />
      </MultiBinding>
  </HierarchicalDataTemplate.ItemsSource>

Пожалуйста, помогите ... Спасибо

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Я думаю, что здесь происходит, когда вы передаете свои коллекции конвертеру (то есть «TreeMultiValueConverter»), вы объединяете две коллекции в одну коллекцию, скажем, ObservableCollection и возвращаете ее в качестве источника.именно поэтому, когда вы добавляете новый элемент в коллекцию вашего подразделения или организации, событие изменения коллекции не распространяется на ItemsSource объекта HierarchicalDataTemplate.

Решение:

Возвращает представление коллекции списка в васпреобразователь и обновленный вид коллекции изменены.

public object Convert(object[] values, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture)
{
    if(values == null || values.Length != 2) return null;

    var combinedList = new List<object>();
    var listCollectionView= new ListCollectionView(combinedList);    

    var childOrgs = values[0] as ObservableCollection<Organization>;
    if(childOrgs != null)
    {
        combinedList.AddRange(childOrgs);
        childOrgs.CollectionChanged += (s,e) => listCollectionView.Refresh();
    }
    var units = values[1] as ObservableCollection<Unit>;
    if(units != null)
    {
        combinedList.AddRange(units);
        units.CollectionChanged += (s,e) => listCollectionView.Refresh();
    }

    listCollectionView.Refresh();
    return listCollectionView;
}
0 голосов
/ 25 октября 2010

Я решил свою проблему, используя частичное расширение моего класса сущностей и добавив коллекцию 'MixedChilds', которая содержит оба типа Organization и Unit.Когда HierarchialDataTemplate привязан к этому, все работает.

...