Проблема с DataBindings, объясните пожалуйста - PullRequest
4 голосов
/ 28 октября 2010
public partial class Form1 : Form
{
    MyClass myClass = new MyClass("one", "two");

    public Form1()
    {
        InitializeComponent();
        textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.Never);
        textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.Never);
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        myClass.Text1 = textBox1.Text;
        myClass.Text2 = textBox2.Text;
        //textBox1.DataBindings["Text"].WriteValue();
        //textBox2.DataBindings["Text"].WriteValue();
    }
}

public class MyClass : INotifyPropertyChanged
{
    private string _Text1;
    private string _Text2;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Text1
    {
        get { return _Text1; }
        set { _Text1 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text1")); }
    }

    public string Text2
    {
        get { return _Text2; }
        set { _Text2 = value; OnPropertyChanged(new PropertyChangedEventArgs("Text2")); }
    }

    public MyClass(string text1, string text2)
    {
        Text1 = text1;
        Text2 = text2;
    }

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, e);
    }
}

Я думаю, довольно ясно, чего я пытаюсь достичь.Я хочу, чтобы моя форма сохранила изменения, сделанные в моих двух TextBox es, в myClass.Но всякий раз, когда я нажимаю кнопку сохранения после редактирования обоих текстовых полей и вызывается saveButton_Click, второй textBox2 s Text возвращается к исходному тексту («два»).Я попытался использовать функцию Binding WriteValue, но происходит то же самое.Использование .net 4.0.

Редактировать Спасибо за ваши ответы, но мне не нужны обходные пути.Я могу найти их сам.Мне просто нужно немного лучше понять, как работает связывание.Я хотел бы понять, почему это происходит?

Ответы [ 2 ]

5 голосов
/ 28 октября 2010

Очевидно, что обновление любого значения в источнике данных приведет к обновлению всех привязок.Это объясняет поведение (настройка myClass.Text1 приводит к обновлению textBox2 с текущим значением myClass.Text2).К сожалению, в нескольких постах, которые мне удалось найти, просто сказано: «Вот как это работает».

Один из способов справиться с этим - создать BindingSource , установить BindingSource.DataSource = myClass,а затем привяжите свои текстовые поля к BindingSource.

BindingSource вызывает ListChanged события, если основным источником данных является список и элементы добавляются, удаляются и т. Д., или , если свойства DataSource изменяются,Вы можете подавить эти события, установив BindingSource.RaiseListChangedEvents в false, что позволит вам установить несколько свойств на myClass без привязки данных, обновляя связанные элементы управления.

public partial class Form1 : Form
{
    MyClass myClass = new MyClass("one", "two");
    BindingSource bindingSource = new BindingSource();

    public Form1()
    {
        InitializeComponent();

        bindingSource.DataSource = myClass;

        textBox1.DataBindings.Add("Text", bindingSource, "Text1", true, DataSourceUpdateMode.Never);
        textBox2.DataBindings.Add("Text", bindingSource, "Text2", true, DataSourceUpdateMode.Never);                
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bindingSource.RaiseListChangedEvents = false;
        myClass.Text1 = textBox1.Text;
        myClass.Text2 = textBox2.Text;
        bindingSource.RaiseListChangedEvents = true;
    }
}

НТН

1 голос
/ 28 октября 2010

Вам необходимо изменить способ привязки данных. Попробуйте это.

MyClass myClass = new MyClass("one", "two");

public Form1()
{
    InitializeComponent();
    textBox1.DataBindings.Add("Text", myClass, "Text1", false, DataSourceUpdateMode.OnPropertyChanged);
    textBox2.DataBindings.Add("Text", myClass, "Text2", false, DataSourceUpdateMode.OnPropertyChanged);
}

private void saveButton_Click(object sender, EventArgs e)
{
    // your object should already have new text values entered.
    // Save your object!

    //myClass.Text1 = textBox1.Text;
    //myClass.Text2 = textBox2.Text;
    //textBox1.DataBindings["Text"].WriteValue();
    //textBox2.DataBindings["Text"].WriteValue();
}

Ключом является DataSourceUpdateMode, это позволит текстовому свойству текстового поля каскадно вписываться в ваш пользовательский объект при каждом изменении свойства. Надеюсь, это поможет.

[Изменить]

Я считаю, что вам нужно сделать, чтобы добиться того, о чем вы просите, это: TextBox1.DataBindings[0].ControlUpdateMode = ControlUpdateMode.Never Эта ссылка должна содержать дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...