C# 如何从itemssource转换项目

C# 如何从itemssource转换项目,c#,wpf,C#,Wpf,如何将单个项目从Itemssource转换为另一个项目 例如,我有一个TypeA集合,它没有直接绑定到TypeB,但我需要在ItemTemplate中访问TypeB <DataGrid ItemsSource={Binding SomeCollectionOfTypeAWhichCanBeConvertedByAlgorithm}> <DataGridTextColumn Binding="{Path=PropertyOfTypeB}" /> </DataG

如何将单个项目从Itemssource转换为另一个项目

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

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

示例:

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

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


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

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


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

您需要做的是扩展视图模型,以便它公开类型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)...
public observeCollection ItemsOfTypeA{get;set;}
私有可观察收集_ItemsOfTypeB;
公共可观察收集项类型B
{
得到
{
if(_ItemsOfTypeB==null)
{
var converted=ItemsOfTypeA.Select(ConvertTypeAToTypeB);
_ItemsOfTypeB=新的可观测集合(已转换);
}
返回_ItemsOfTypeB;
}
}
专用类型B转换器类型B(类型a)。。。

在本例中,我假设TypeA集合将发生更改,并且您需要将这些更改传播到UI—您需要处理该属性上的
CollectionChanged
事件,并处理添加项、删除项、,并在引发TypeB集合时刷新它。这意味着您还需要知道哪个TypeA对象创建了给定的TypeB对象,这样,当删除TypeA对象时,您就可以知道要从TypeB集合中删除哪个对象。

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

最好在一个小示例中解决这个问题。是的,这个问题还不够清楚,无法回答。添加了示例,请参阅第一个答案为什么每次都删除我的代码?但我需要网格中类型A和B的属性?所以我可能需要一个包装器或pair类。