WPF分层树视图多重绑定混合列表问题

时间:2010-10-18 13:20:55

标签: wpf entity-framework wpf-controls binding prism

我很难解决这个简单的问题:

我正在使用带有HierarichalDataTemplate的树视图来显示两个实体的层次结构:OrganizationUnit。本组织与其本身有很多关系,因为它可能有子组织。每个组织与单位有一对多的关系,因为一个组织可以包含几个单位。

我成功地使用带有可观察集合的multibindings来填充树。在初始化中调用转换器,但我不能再次调用它。因此,当我添加任何单位或组织时,列表不会更新:

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

请帮忙...... 感谢

2 个答案:

答案 0 :(得分:1)

我认为这里发生的事情是当你将集合传递给转换器(即“TreeMultiValueConverter”)时,你将两者合并为一个集合,比如一个ObservableCollection并将其作为源返回。

这正是当您向单元或组织集合添加新项目时,集合已更改事件不会传播到HierarchicalDataTemplate的ItemsSource。

解决方案:

返回转换器中的列表集合视图,并更新集合更改后的视图。

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;
}

答案 1 :(得分:0)

我已经使用部分扩展我的实体类来解决了我的问题,并添加了一个同时包含组织和单元类型的'MixedChilds'集合。 当HierarchialDataTemplate与之绑定时,一切正常。