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

WPF层次树视图多绑定混合列表问题,wpf,entity-framework,wpf-controls,binding,prism,Wpf,Entity Framework,Wpf Controls,Binding,Prism,我很难解决这个简单的问题: 我正在使用一个带有层次结构数据模板的树状视图来显示两个实体的层次结构:组织和单位。组织与其自身有多对多关系,因为它可以有子组织。每个组织与单位之间有一对多的关系,因为一个组织可以包含多个单位 我正在成功地使用带有可观察集合的多重绑定来填充树。在初始化时调用了转换器,但我无法再次调用它。因此,当我添加任何单位或组织时,列表不会更新: <HierarchicalDataTemplate.ItemsSource> <MultiBinding

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

我正在使用一个带有层次结构数据模板的树状视图来显示两个实体的层次结构:
组织
单位
。组织与其自身有多对多关系,因为它可以有子组织。每个组织与单位之间有一对多的关系,因为一个组织可以包含多个单位

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

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

请帮忙。。。
谢谢

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

这就是为什么在向单位或组织集合添加新项时,集合更改事件不会传播到HierarchycalDataTemplate的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;
}
公共对象转换(对象[]值,类型targetType,对象参数,
System.Globalization.culture(信息文化)
{
if(values==null | | values.Length!=2)返回null;
var combinedList=新列表();
var listCollectionView=新的listCollectionView(组合列表);
var childOrgs=值[0]作为可观察集合;
if(childOrgs!=null)
{
combinedList.AddRange(childOrgs);
childOrgs.CollectionChanged+=(s,e)=>listCollectionView.Refresh();
}
var单位=作为可观测集合的值[1];
如果(单位!=null)
{
组合列表。添加范围(单位);
units.CollectionChanged+=(s,e)=>listCollectionView.Refresh();
}
listCollectionView.Refresh();
返回listCollectionView;
}

我通过对entity类进行部分扩展,并添加一个“MixedChilds”集合来解决问题,该集合同时包含组织和单位类型。
当HierarchicalDataTemplate绑定到该模板时,一切正常。

谢谢。我已经尝试了您的解决方案,但下面的行似乎返回null,因为值[0]实际上是EntityCollection,并且在运行时强制转换为observableCollection:var childOrgs=values[0]作为observableCollection;有什么想法吗?看起来你已经直接绑定到实体模型了?请尝试将强制转换从ObservaleCollection`1更改为EntityCollection。我们无法更改此设置,因为我们需要同时观察子组织和单位,以便使用CollectionChanged事件。EntityCollection不包含此事件。感谢您的回复。我找到了另一个解决方案并发布了它+1给你!