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

如何从itemssource转换项

  •  0
  • Falcon  · 技术社区  · 14 年前

    如何将单个项从itemsource转换为另一个项?

    例如,我有一个typea集合,它没有直接绑定到typeb,但是我需要访问itemtemplate中的typeb。

    <DataGrid ItemsSource={Binding SomeCollectionOfTypeAWhichCanBeConvertedByAlgorithm}>
        <DataGridTextColumn Binding="{Path=PropertyOfTypeB}" />
    </DataGrid>
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Falcon    14 年前

    最后我使用了Pair类并将itemsource绑定到集合。

        2
  •  0
  •   Falcon    14 年前

    例子:

    <DataGrid ItemsSource="{Binding CollectionOfTypeAWhichCanBeConvertedToTypeB}" >
        <DataGridTextColumn Binding="{Binding Path=PropertyOfTypeB}" />
    </DataGrid>
    

    我搜索一个方法,将集合中的项从模板内的typeA转换为typeB。我不能为属性绑定使用转换器,因为我需要维护引用。

    我不能在B中提及A,反之亦然。

        3
  •  0
  •   Doobi    14 年前

    除非typea是typeb的一个子类型,否则它不会工作。最好的办法是在将这些项绑定到itemsource之前将它们转换为typeb。

    如果适合,请尝试automapper,或者如果是.NET 4,dynamics。

        4
  •  0
  •   Robert Rossney    14 年前

    您需要做的是扩展视图模型,以便它公开类型B的集合。在内部,它看起来像:

    public ObservableCollection<TypeA> ItemsOfTypeA { get; set; }
    
    private ObservableCollection<TypeB> _ItemsOfTypeB;
    
    public ObservableCollection<TypeB> ItemsOfTypeB
    {
       get
       {
          if (_ItemsOfTypeB == null)
          {
             var converted = ItemsOfTypeA.Select(ConvertTypeAToTypeB);
             _ItemsOfTypeB = new ObservableCollection<TypeB>(converted);
          }
          return _ItemsOfTypeB;
       }
    }
    
    private TypeB ConvertTypeAToTypeB(TypeA a)...
    

    在这个示例中,我假设typea集合将发生更改,并且您需要这些更改来传播到UI,因此需要处理 CollectionChanged 该属性上的事件,处理添加项、删除项以及在引发typeb集合时刷新它。这意味着你会 需要一种方法来知道哪个typea对象创建了一个给定的typeb对象,这样当typea对象被删除时,您就知道要从typeb集合中删除哪个对象。