WPF如何使用值转换器绑定两个不同但相关类型的可观察集合?

时间:2011-02-28 06:12:17

标签: wpf data-binding wpf-controls

我有一个带有可观察集合(DP)的自定义控件,其中包含某些类型的对象。我想将它绑定到另一个可观察的集合,在我的VM中保存不同的类型对象。我该怎么做?

我应该做这样的事吗?

编辑。当然,当集合中的元素被修改时,绑定应该起作用。

3 个答案:

答案 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
        }
    }