用户控件数据绑定第一次不起作用

时间:2016-02-19 07:24:47

标签: c# data-binding user-controls

myUserControl包含两个控件。一个textbox和一个标签。此用户控件位于类库项目中。它将用于其他几个项目。

我会像这样绑定。

myControl1.Databindings.Add("DataSource",myObject,"PropertyName");

在这里,PropertyName将直接与文本框绑定(我成功了),并在myObject中定义了一个属性,以使用PropertyName获取标签名称。因此,虽然userControl正在设置标签和文本框,但它需要整个绑定来绑定标签和文本框数据。

我所做的就是在这里(在控制中):

private object dataSource;
    [DefaultValue("")]
    public Object DataSource
    {
        get
        {
            return dataSource;
        }
        set
        {
            dataSource = value;

            OnPropertyChanged(new PropertyChangedEventArgs("DataSource"));
            BindControls();
            if (dataSource != null)
            {
                textBox1.Text = dataSource.ToString();
            }

        }
    }

    //Method to bind datasource with controls
    public void BindControls()
    {
        if (this.DataBindings.Count > 0)
        {
            //Get the instance of the binded object
            object myObj = this.DataBindings[0].DataSource as object;

            //Get binded field name as string
            string bindingField = this.DataBindings[0].BindingMemberInfo.BindingField;

            //Get Type of the binded object
            Type t1 = myObj.GetType();

            //Get property information for the binded field
            PropertyInfo property = t1.GetProperty(bindingField);

            //Get text value for label
            LabelText = property.GetAttribute<DisplayNameAttribute>(false).DisplayName;
            textBox1.ForeColor = Color.Black;
            //If textbox data is null or empty, get descrition or comment as the textbox text.
            if (string.IsNullOrEmpty(dataSource.ToString()))
            {
                dataSource = property.GetAttribute<DescriptionAttribute>(false).Description;
                textBox1.ForeColor = Color.DarkGray;
            }
        }
    }

我第一次从FORM使用此控件绑定DataSource时,虽然textbox包含正确的值,但标签文本为空。我找到的原因,DataBinding仍为空。

在我的表单中,我使用了一个复选框来切换对象值。当我检查该值时,Usercontrol获取数据绑定,然后一切正常。

1 个答案:

答案 0 :(得分:0)

问题在于你正在筹集的财产变化。 该字符串应与属性名称相同。 尝试这样的事情......

 public string Name
        {
            get { return m_Name; }
            set
            {
                if (m_Name != value)
                {
                    m_Name = value;
                    OnChange("Name");
                }
            }
        }