如何将单个Item从Itemssource转换为另一个Item?
例如,我有一个TypeA集合,它没有直接绑定到TypeB,但我需要在ItemTemplate中访问TypeB。
<DataGrid ItemsSource={Binding SomeCollectionOfTypeAWhichCanBeConvertedByAlgorithm}>
<DataGridTextColumn Binding="{Path=PropertyOfTypeB}" />
</DataGrid>
答案 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集合中删除哪个对象。