当更改 属性 值 c# 时,WinForms 双向绑定不起作用

WinForms two way bindings don't work when change property value c#

我有这段代码,还有一个 TextBox 控件 txtTest。

public partial class Form1 : Form
{

    public Test TestProperty { get; set; }

    public Form1()
    {
        InitializeComponent();
        TestProperty = new Test();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        TestProperty.Value = 15;
        txtTest.DataBindings.Add("Text", TestProperty, 
            nameof(TestProperty.Value),false, 
            DataSourceUpdateMode.OnPropertyChanged); // textTest has value 15
        TestProperty.Value = 10; // textTest has value 15
    }
}

public class Test
{
    public int Value { get; set; }
}

在表单加载时,我将值 15 分配给值 属性,之后我在文本 属性 上添加了对 txtTest 控件的绑定,现在我的控件显示 txtTest.Text =“15”。绑定后,我为我的值 属性 10 分配了新值。现在我的 txtTest 控件仍然显示值 15。如果我通过表单在我的文本框控件中输入例如 20,我在 属性 值中有值 20。

对于这种情况,为什么我的 txtTest.Text 属性 中没有值 10?

要支持 two-way 业务对象的数据绑定,您需要在对象中的数据更改时发出更改通知。为此,您可以使用以下任一选项:

  • 您可以为您的 class 实施 INotifyPropertyChanged。 (✔ 首选)

  • 或者您可以为您实施 [PropertyName]Changed 模式 属性;假设你有 XXXX 属性,那么你需要在你的 class.

    中有 XXXXChanged 事件

要了解有关数据绑定和更改通知的更多信息,请查看以下文档:

您可以在以下文档中找到更有用的文档:

示例 - 实施 INotifyPropertyChanged

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Customer : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    string firstName;
    public string FirstName
    {
        get { return firstName; }
        set {
            if (value != firstName) {
                firstName = value;
                NotifyPropertyChanged();
            }
        }
    }
    string lastName;
    public string LastName
    {
        get { return lastName; }
        set {
            if (value != lastName) {
                lastName = value;
                NotifyPropertyChanged();
            }
        }
    }
}

示例 2 - 应用 [PropertyName]已更改 模式

using System;
public class Customer 
{
    public event EventHandler FirstNameChanged;
    public event EventHandler LastNameChanged;
    protected void OnFirstNameChanged(EventArgs e)
    {
        FirstNameChanged?.Invoke(this, e);
    }
    protected void OnLastNameChanged(EventArgs e)
    {
        LastNameChanged?.Invoke(this, e);
    }
    string firstName;
    public string FirstName
    {
        get { return firstName; }
        set {
            if (value != firstName) {
                firstName = value;
                OnFirstNameChanged(EventArgs.Empty);
            }
        }
    }
    string lastName;
    public string LastName
    {
        get { return lastName; }
        set {
            if (value != lastName){
                lastName = value;
                OnLastNameChanged(EventArgs.Empty);
            }
        }
    }
}