【问题标题】:c# visual studio custom control binding issuec# Visual Studio 自定义控件绑定问题
【发布时间】:2017-07-30 16:46:34
【问题描述】:

我想创建一个简单的自定义控件(实际上是一种按钮)。我已经创建了控件,但我缺少的步骤是如何添加绑定。我的控制代码如下所示:

public partial class PopUpButton : UserControl
{

    public PopUpButton()
    {
        InitializeComponent();
        _checked = false;
        DrawButton();
    }
    public delegate void ChangedEventHandler(object sender, EventArgs e);
    public event ChangedEventHandler OnValueChanged;
    private bool _checked;
    private String _text;

    private void UserControl1_Resize(object sender, EventArgs e)
    {
        DrawButton();
    }

    [Bindable(true)]
    public bool Checked
    {
        get
        {
            return _checked;
        }
        set
        {
            _checked = value;
            DrawButton();
            if (OnValueChanged != null)
            {
                OnValueChanged.Invoke(this, new EventArgs());
            }
        }
    }

    [Bindable(true)]
    public String DisplayText
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            DrawButton();
        }
    }

    private void DrawButton()
    {
        // do some stuff
    }

    private void PopUpButton_Click(object sender, EventArgs e)
    {
        _checked = !_checked;
        DrawButton();
        if (OnValueChanged != null)
        {
            OnValueChanged.Invoke(this, new EventArgs());
        }
     }
}

绑定到控件的调用如下所示:

        regControl1.DataBindings.Clear();
        regControl1.DataBindings.Add("Checked", CustomButton1, "Checked");   

我知道我需要定义一个数据源和成员,但看不到如何实现它。调用上述绑定时,regControl1 会更新为“Checked”的值,但函数“OnValueChanged”始终为空,因此绑定失败,因此当“Checked”更改时,“regControl1”不会更新。

有什么想法吗?

【问题讨论】:

  • 您正在尝试将regControl1Checked 属性绑定到CustomButtonChecked 属性的值?如果这是真的,那么CustomButton 需要实现INotifyPropertyChanged,以便regContol1 将收到CustomControl1Checked 属性更改的通知。
  • 仅供参考,在这种情况下被绑定的对象是regControl1CustomButton1 只是绑定的目标。因此,您在 PopUpButton 中的绑定代码不会在这里使用。
  • 是的,我正在尝试将 regControl1 的属性绑定到 CustomButton 的 Checked 属性。我确实使用 INotifyPropertyChanged 方法到达了那里,但让我难过的是添加什么作为数据源。 stuartd 指出的示例是包含已经具有“数据源”属性的列表的组件。而一个不起眼的按钮没有,所以我读过的例子没有多大帮助。

标签: c# visual-studio data-binding user-controls


【解决方案1】:

终于搞定了。此解决方案处理对主体和标签的单击,并在设计期间重新调整组件的大小。我快到了,但希望这会有所帮助:

public partial class PopUpButton : UserControl, INotifyPropertyChanged
{

    public PopUpButton()
    {
        InitializeComponent();
        _checked = false;
        DrawButton();
    }
    private bool _checked;
    private String _text;

    public event PropertyChangedEventHandler PropertyChanged;
    public event EventHandler ButtonClick;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    protected void Button_Click(object sender, EventArgs e)
    {
        _checked = !_checked;
        DrawButton();
        NotifyPropertyChanged("Checked");
        if (this.ButtonClick != null)
            this.ButtonClick(this, e);
    }

    private void UserControl1_Resize(object sender, EventArgs e)
    {
        DrawButton();
    }

    [Bindable(true)]
    public bool Checked
    {
        get
        {
            return _checked;
        }
        set
        {
            _checked = value;
            DrawButton();
            NotifyPropertyChanged("Checked");
        }
    }

    [Bindable(true)]
    public String DisplayText
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
            DrawButton();
        }
    }

    private void HandleClick( )
    {
        _checked = !_checked;
        DrawButton();
        NotifyPropertyChanged("Checked");
    }

    private void DrawButton()
    {
        //do some drawing stuff here
    }

    private void PopUpButton_Resize(object sender, EventArgs e)
    {
        DrawButton();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多