首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数据绑定POCO属性

数据绑定POCO属性
EN

Stack Overflow用户
提问于 2009-03-02 10:27:49
回答 6查看 4.7K关注 0票数 17

是否有任何数据绑定框架(BCL或其他)允许在实现INotifyPropertyChangedINotifyCollectionChanged的任何两个CLR属性之间进行绑定?看起来应该可以做这样的事情:

var binding = new Binding();
binding.Source = someSourceObject;
binding.SourcePath = "Customer.Name";
binding.Target = someTargetObject;
binding.TargetPath = "Client.Name";
BindingManager.Bind(binding);

其中someSourceObjectsomeTargetObject只是实现INotifyPropertyChanged的POCOs。然而,我不知道有任何BCL支持这一点,也不确定是否有现有的框架允许这样做。

更新:鉴于目前没有可用的库,我自己编写了自己的库。它可以在here上找到。

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-06-11 12:16:02

我写了Truss来填补这个空白。

票数 11
EN

Stack Overflow用户

发布于 2009-03-10 06:36:00

我不知道有什么库可以做到这一点--但是你可以很容易地编写你自己的库。

下面是我在几分钟内总结出的在两个简单属性之间建立双向数据绑定的基础:

public static class Binder
{

    public static void Bind(
        INotifyPropertyChanged source,
        string sourcePropertyName,
        INotifyPropertyChanged target,
        string targetPropertyName)
    {
        var sourceProperty
            = source.GetType().GetProperty(sourcePropertyName);
        var targetProperty
            = target.GetType().GetProperty(targetPropertyName);

        source.PropertyChanged +=
            (s, a) =>
            {
                var sourceValue = sourceProperty.GetValue(source, null);
                var targetValue = targetProperty.GetValue(target, null);
                if (!Object.Equals(sourceValue, targetValue))
                {
                    targetProperty.SetValue(target, sourceValue, null);
                }
            };

        target.PropertyChanged +=
            (s, a) =>
            {
                var sourceValue = sourceProperty.GetValue(source, null);
                var targetValue = targetProperty.GetValue(target, null);
                if (!Object.Equals(sourceValue, targetValue))
                {
                    sourceProperty.SetValue(source, targetValue, null);
                }
            };
    }
}

当然,这段代码缺少一些细节。要添加的内容包括

  • 检查sourcetarget是否为sourcePropertyNametargetPropertyName exist
  • Checking标识的属性,以检查这两个属性之间的类型兼容性

此外,反射相对较慢(尽管在丢弃它之前对其进行基准测试,它也不是那么慢),因此您可能希望使用编译后的表达式。

最后,考虑到通过字符串指定属性容易出错,您可以改用Linq表达式和扩展方法。那就不写了

Binder.Bind( source, "Name", target, "Name")

你可以写

source.Bind( Name => target.Name);
票数 8
EN

Stack Overflow用户

发布于 2009-03-06 00:42:00

AutoMapper可以在两个实例之间复制值,但您必须编写自己的代码才能自动执行此操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/601880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档