【问题标题】:Data bound custom control with updating data when changed数据绑定自定义控件,在更改时更新数据
【发布时间】:2010-03-09 21:31:17
【问题描述】:

我有一个关于数据绑定的问题

如果我们的 A 类具有某些属性,例如“用户名”和文本控件 T1,绑定如下:

T1.DataBindings.Add("Text",A,"UserName",true,DataSourceUpdateMode.OnPropertyChanged); 

即用户编辑文本时将更新属性

现在,如果我们有自定义控件 C1 而不是文本框,其控件属性为“ControlProp”(例如 MyEnum 类型),并且它绑定到具有 MyEnum 类型的属性 MyProp 的类 B,如下所示:

C1.DataBindings.Add("ControlProp ",B," MyProp",true,DataSourceUpdateMode.OnPropertyChanged); 

问题是:如何确保自定义控件的行为类似于上述文本框,即当 ControlProp 更改时将更新 B 类属性?您的帮助将非常宝贵。坦克

【问题讨论】:

  • 你问的是UC属性还是B类属性?
  • 换句话说,我的问题是:如何确保使用 DataSourceUpdateMode.OnPropertyChanged 自定义控件的行为类似于标准(例如 TextBox)控件?

标签: c# winforms data-binding


【解决方案1】:

首先,你的 B 类必须实现 INotifyPropertyChanged 接口。这是完整的代码或B类

public class ClassB : System.ComponentModel.INotifyPropertyChanged
{
    private string myprop;

    public string MyProp
    {
    get
    {
        return myprop;
    }
    set
    {
        if (value != myprop)
        {
        myprop = value;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("MyProp"));
        }


        }


    }
    }

    #region INotifyPropertyChanged Members

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    #endregion

}

然后,假设您的自定义控件内部有一个标签,并且您希望将标签的文本与您的 B 类实例绑定。例如:

public partial class MyCustomControl : UserControl
{
    public MyCustomControl()
    {
        InitializeComponent();
    }

    public string MyCustomProperty
    {
        get
        {
            return label1.Text;
        }
        set
        {
            label1.Text = value;
        }
    }
}

如果您将 B 类的属性 MyProp 绑定到自定义控件的 MyCustomProperty,当您更改对象中的属性时,label1 应该更改其文本。

    ClassB objectB = new ClassB();

    C1.DataBindings.Add("MyCustomProperty", objectB, "MyProp", true, DataSourceUpdateMode.OnPropertyChanged);

    objectB.MyProp = "Text 1";
    objectB.MyProp = "Text 2";

    // The final text is Text2

【讨论】:

  • 感谢您的回复。相反的方向呢:例如自定义控件包含一组绑定到枚举类型的某些字段的单选按钮。如何确保在控件失去焦点之前更新底层数据?
  • 我正在尝试,但我没有在正确的时间更新对象字段......我会告诉你如果我弄清楚如何......
【解决方案2】:

我想我找到了解决方案:将 Inotifypropertychange 添加到控件定义中: 公共部分类 MyCustomControl:UserControl、INotifyPropertyChanged 在控件属性设置器中,我引发了事件(如 Javier Morillo 的示例)

谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多