需要的只是一个数据源多的BindingSource组件?(Multiple BindingSourc

2019-10-17 12:57发布

按照我刚才的问题, 使可用于数据通过某种在.NET接口的绑定属性? ,我管理,的帮助下@Marc Gravell通过实施接口ICustomTypeDescriptor我可以提供表单设计器与可能或可能不会实际上是有问题的真正的正常属性计算组件上可见的自定义属性。

我管理这一点,但我的实现是有缺陷的。 我现在最大的问题是,如果我将我的表格,其中有两个这样的自定义属性上的组件,然后放下两个文本框到窗体,并使用数据绑定,数据在属性检查结合下拉需要一个对象的数据源,但每个I结合到控制属性增加了另一个BindingSource的组件到的形式。

让我换一种说法。 我将我的自定义组件到窗体。 它有两个属性,这都可以通过我的ICustomTypeDescriptor实现,但作为普通的属性不可见。

然后我把两个文本框到窗体。 我去属性检查器为其中的一个添加数据的Text属性绑定,它需要在项目中的对象数据源,我补充一点。 然后,在文本框到我的自定义组件的第一属性绑定Text属性后,窗体设计器中添加了其他成分,这是用来桥接数据两者结合“customDataBindingBindingSource”。 到现在为止还挺好。

然后,当我建立数据以同样的方式,其他文本框结合(除了我现在可以随便挑我的自定义组件的其他财产),另一个这样的桥是补充说,“customDataBindingBindingSource1”。 如果我保持切换到结合性能,一个这种桥每次加入。

这真的有必要吗?

如果没有,我怎么在我做错了ICustomTypeDescriptor实施? 诚然,这是幼稚和简单尚不完整,但我不知道我需要修复。 任何指针?

这里是我的自定义类:

public class CustomDataBinding : Component, ICustomTypeDescriptor, INotifyPropertyChanged
{
    private String _Property1;
    private String _Property2;

    public class MyPropertyDescriptor : PropertyDescriptor
    {
        private String _Name;

        public MyPropertyDescriptor(String name)
            : base(name, null)
        {
            _Name = name;
        }

        public override bool CanResetValue(object component)
        {
            return true;
        }

        public override Type ComponentType
        {
            get { return typeof(CustomDataBinding); }
        }

        public override object GetValue(object component)
        {
            CustomDataBinding source = (CustomDataBinding)component;
            switch (_Name)
            {
                case "Property1":
                    return source._Property1;
                    break;

                case "Property2":
                    return source._Property2;
                    break;

                default:
                    return null;
            }
        }

        public override bool IsReadOnly
        {
            get { return false; }
        }

        public override Type PropertyType
        {
            get { return typeof(String); }
        }

        public override void ResetValue(object component)
        {
            SetValue(component, _Name);
        }

        public override void SetValue(object component, object value)
        {
            CustomDataBinding source = (CustomDataBinding)component;
            switch (_Name)
            {
                case "Property1":
                    source._Property1 = Convert.ToString(value);
                    Debug.WriteLine("Property1 changed to " + value);
                    break;

                case "Property2":
                    source._Property2 = Convert.ToString(value);
                    Debug.WriteLine("Property2 changed to " + value);
                    break;

                default:
                    return;
            }
            source.OnPropertyChanged(_Name);
        }

        public override bool ShouldSerializeValue(object component)
        {
            return false;
        }
    }

    public CustomDataBinding()
    {
        _Property1 = "Property1";
        _Property2 = "Property2";
    }

    #region ICustomTypeDescriptor Members

    public AttributeCollection GetAttributes()
    {
        return new AttributeCollection(null);
    }

    public string GetClassName()
    {
        return null;
    }

    public string GetComponentName()
    {
        return null;
    }

    public TypeConverter GetConverter()
    {
        return null;
    }

    public EventDescriptor GetDefaultEvent()
    {
        return null;
    }

    public PropertyDescriptor GetDefaultProperty()
    {
        return null;
    }

    public object GetEditor(Type editorBaseType)
    {
        return null;
    }

    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    {
        return new EventDescriptorCollection(null);
    }

    public EventDescriptorCollection GetEvents()
    {
        return new EventDescriptorCollection(null);
    }

    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        return new PropertyDescriptorCollection(new PropertyDescriptor[] {
            new MyPropertyDescriptor("Property1"),
            new MyPropertyDescriptor("Property2") });
    }

    public PropertyDescriptorCollection GetProperties()
    {
        return GetProperties(null);
    }

    public object GetPropertyOwner(PropertyDescriptor pd)
    {
        return this;
    }

    #endregion

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(String name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public void SetValues(String p1, String p2)
    {
        _Property1 = p1;
        _Property2 = p2;

        OnPropertyChanged("Property1");
        OnPropertyChanged("Property2");
    }

    #endregion
}

另外,我需要手动挂钩这些桥梁多达我原本,扔下组件,在窗体的构造,就像这样:

customDataBindingBindingSource.DataSource = customDataBinding1;
customDataBindingBindingSource1.DataSource = customDataBinding1;

有没有办法让身边的很多吗?

基本上,我想用我的组件时,要做到这一点:

  1. 将我的自定义组件的一个到窗体
  2. 降必要的控制(文本框,日期选择器等)
  3. 分配在我的自定义组件数据的控件相关属性绑定

如果可能的话,我想,以避免项目的数据源和桥梁构件,以及在构造函数中的代码。 所有这一切,我想避免的。

请注意,我不要求任何人给我德码 。 任何指针欢迎。

文章来源: Multiple BindingSource components necessary for just one data source?