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