如何从itemssource转换项目

时间:2010-08-11 11:35:35

标签: c# wpf

如何将单个Item从Itemssource转换为另一个Item?

例如,我有一个TypeA集合,它没有直接绑定到TypeB,但我需要在ItemTemplate中访问TypeB。

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

4 个答案:

答案 0 :(得分:1)

我最终使用Pair类并将itemssource绑定到集合。

答案 1 :(得分:0)

示例:

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

我搜索一个方法,将集合中的项目从TypeA转换为模板内的TypeB。我不能将转换器用于Property-Binding,因为我需要维护引用。

我不能在B中引用A,反之亦然。

答案 2 :(得分:0)

除非TypeA是TypeB的子类型,否则它不会起作用。最好的办法是在将项目绑定到ItemSource之前将项目转换为typeB。

尝试使用Automapper,如果它适合,或者如果它是.NET 4,动态。

答案 3 :(得分:0)

您需要做的是扩展您的视图模型,以便它公开类型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集合中删除哪个对象。