C#中的数据绑定问题

时间:2010-10-21 19:53:06

标签: c# .net winforms data-binding

我试图更好地理解数据绑定在.net中的工作原理。我正在查看this文章,我想出了这段代码:

public partial class Form1 : Form//, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler MyTextChanged;

    [System.ComponentModel.Bindable(true)]
    public string MyText
    {
        get { return textBox1.Text; }
        set 
        {
            textBox1.Text = value;
            if (MyTextChanged != null)
                MyTextChanged(this, new PropertyChangedEventArgs("MyText"));
        }
    }

    MyClass myClass { get; set; }

    public Form1()
    {
        InitializeComponent();
        myClass = new MyClass();
        Binding binding = new Binding("MyText", myClass, "Dic");
        binding.Parse += new ConvertEventHandler(binding_Parse);
        binding.Format += new ConvertEventHandler(binding_Format);
        DataBindings.Add(binding);
        myClass.AddStuff("uno", "UNO");
    }

    void OnMyTextChanged(PropertyChangedEventArgs e)
    {
        if (MyTextChanged != null) MyTextChanged(this, e);
    }

    void binding_Format(object sender, ConvertEventArgs e)
    {
        if (e.Value is Dictionary<string, string>)
        {
            Dictionary<string, string> source = (Dictionary<string, string>)e.Value;
            e.Value = source.Count.ToString();
        }
    }

    void binding_Parse(object sender, ConvertEventArgs e)
    {
        MessageBox.Show(e.DesiredType.ToString());
    }

    private void changemyClassButton_Click(object sender, EventArgs e)
    {
        myClass.AddStuff(myClass.Dic.Count.ToString(), "'" + myClass.Dic.Count.ToString() + "'");
    }

    private void changeMyTextButton_Click(object sender, EventArgs e)
    {
        MyText = "1234";
    }
}

public class MyClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Dictionary<string, string> Dic { get; set; }

    public MyClass()
    {
        Dic = new Dictionary<string, string>();
    }

    public void AddStuff(string key, string value)
    {
        Dic.Add(key, value);
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Dic"));
    }
}

我正在尝试将MyText绑定到myClass。问题是函数binding_Parse永远不会被调用。我知道我可以将textBox1.Text直接绑定到myClass,或者可能还有其他一千种方法可以做我正在尝试做的事情,但这只是一种做法;我正在尝试理解更好的数据绑定。所以我想将自定义对象绑定到自定义属性,以便我可以从头到尾看到该过程。自定义对象为myClass,自定义属性为MyText。我尝试了各种变体,比如实现INotifyPropertyChanged,但我无法调用binding_Parse(我希望在调用changeMyTextButton_Click时调用它)。我错过了什么吗?

修改 更简单一点:我想编写一个带有属性string MyText的用户控件,然后用户可以绑定到其他东西,就像绑定TextBox的{​​{1}}属性一样别的东西。所以我不想将控件的属性绑定到对象,我想用一个属性编写一个控件,然后用户可以绑定到一个对象。

2 个答案:

答案 0 :(得分:2)

好吧,如果有人遇到同样的问题,我想出来了。我必须创建一个名为MyTextChanged的事件处理程序,让Binding知道MyText正在发生变化,并将Binding s DataSourceUpdateMode属性设置为{{1} }。使用这个简单的原理,我可以将屏幕上的像素绑定到宇宙的其余部分:)。这是代码:

OnPropertyChanged

答案 1 :(得分:1)

也许这会帮助你,理解何时执行Parse事件。

要查看binding_Parse工作,请查看此示例:

public partial class Form1 : Form
{

    public MyClass myClass { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        myClass = new MyClass();
        myClass.AddStuff("uno", "UNO");

        Binding b = new Binding("Text", myClass, "Dic");
        b.Parse += new ConvertEventHandler(b_Parse);
        b.Format += new ConvertEventHandler(b_Format);
        textBox1.DataBindings.Add(b);
    }

    void b_Format(object sender, ConvertEventArgs e)
    {
        e.Value = (e.Value as Dictionary<string, string>)["uno"].ToString();
        textBox1.Text = e.Value.ToString();
    }

    void b_Parse(object sender, ConvertEventArgs e)
    {
        MessageBox.Show("This is executed when you lost focus\n\nI'm parsing your entered text: " + e.Value);
    }


}

你只需要调试。单击按钮,然后注意首先调用Format事件。 然后,如果您手动更改textbox1.Text值,当您再次单击该按钮时,将会失去焦点,然后将执行Parse事件。

要创建自定义控件,请同时选中this site