【问题标题】:WPF Hierarchial Treeview Multbinding Mixed List ProblemWPF分层树视图多重绑定混合列表问题
【发布时间】:2011-04-26 22:50:35
【问题描述】:

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

我正在使用带有 HierarichalDataTemplate 的树视图来显示两个实体的层次结构:OrganizationUnit。该组织与其自身存在多对多关系,因为它可以有子组织。并且每个组织都与单元有一对多的关系,因为一个组织可以包含多个单元。

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

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

请帮忙... 谢谢

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

    • 谢谢。我已经尝试过您的解决方案,但似乎以下行返回 null 因为 values[0] 实际上是一个 EntityCollection 并且运行时强制转换为 observableCollection : var childOrgs = values[0] as ObservableCollection;有什么想法吗?
    • 您似乎已直接绑定到您的实体模型?尝试将转换从 ObservableCollection`1 更改为 EntityCollection。
    • 我们不能这样做,因为我们需要 childOrgs 和 units 都是可观察的,因此我们可以使用 CollectionChanged 事件。 EntityCollection 不包含此事件。
    • 感谢您的回复。我找到了另一个解决方案并发布了它。为你 +1!
    【解决方案2】:

    我通过部分扩展实体类解决了我的问题,并添加了一个“MixedChilds”集合,其中包含组织和单位类型。 当 HierarchialDataTemplate 绑定到它时,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多