代码之家  ›  专栏  ›  技术社区  ›  OrPaz

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

  •  0
  • OrPaz  · 技术社区  · 15 年前

    我使用带有HierarichalDataTemplate的treeview来显示两个实体的层次结构: Organization Unit

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

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

    请帮忙。。。 谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Tri Q Tran    15 年前

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

    这正是将新项添加到单位或组织集合时,集合更改事件不会传播到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;
    }
    
        2
  •  0
  •   OrPaz    15 年前

    当hierarchicaldatatemplate绑定到该模板时,一切正常。

    推荐文章