我有一个带有可观察集合(DP)的自定义控件,其中包含某些类型的对象。我想将它绑定到另一个可观察的集合,在我的VM中保存不同的类型对象。我该怎么做?
我应该做这样的事吗?
编辑。当然,当集合中的元素被修改时,绑定应该起作用。
答案 0 :(得分:3)
Meleak 的评论是正确的,您应该以某种方式将一个集合转换为另一个集合并同步它们。以下是我上次的表现:
查看(我在下面将其命名为MyControl
)具有Items
类型的属性IEnumerable<Target>
DataContext具有Items
IEnumerable<Source>
class CollectionsConverter : IValueConverter
{
public object Convert(object value, ...)
{
var source = (ObservableCollection<Source>)value;
var target = new ObservableCollection<Target>(source.Select(/* Convert items somehow /);
// subscribe to both target's and source's 'CollectionChanged' events
// and propagate them back and forth to another collection.
// Propagated events should have converted items of course
return target;
}
...
}
然后在XAML中:
<MyControl Items="{Binding Items, Converter=CollectionsConverter}" />
关于转换每个项目 - 它可以是通用代码,它将动态确定如何将Source
转换为Target
,反之亦然,或者它应该是一个代码,它将知道它将转换的确切类型以及如何转换它们。
答案 1 :(得分:0)
ValueConverters不按照您描述的方式工作,您必须手动创建新的集合。
这不能直接回答您的问题,但在ReactiveUI(http://www.reactiveui.net)中,这种情况非常简单:
var derivedColl = someCollection.CreateDerivedCollection(x => new SomeOtherClass(x));
答案 2 :(得分:-1)
使用实现IValueConverter的自定义Converter类
public class ObserverTypeConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//return your dependency type from here
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//return your view model type from here, this will get fired if your binding is two way
}
}