8

我使用 Winforms 数据绑定,并且我有派生类,基类在其中实现IPropertychanged

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName) {
        var handler = this.PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

每个属性设置器调用:

    protected void SetField<T>(ref T field, T value, string propertyName) {
        if (!EqualityComparer<T>.Default.Equals(field, value)) {
            field = value;
            IsDirty = true;
            this.RaisePropertyChanged(propertyName);
        }
    }

一个典型的 Propertysetter:

    public String LocalizationItemId {
        get {
            return _localizationItemId;
        }
        set {
             SetField(ref _localizationItemId, value, "LocalizationItemId");
        }
    }

属性绑定到文本框的方式

        private DerivedEntity derivedEntity
        TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname");

如果我以编程方式将文本分配给文本框,则文本框不会显示它。但我可以手动编辑文本框。

4

4 回答 4

12

我知道现在回答为时已晚,但是这个问题可以解决,如果您在绑定应该更改值时设置事件,如果您在属性值更改事件上设置它,您的问题将得到解决。你可以通过这种方式做到这一点

textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty", true, DataSourceUpdateMode.OnPropertyChanged);
于 2014-12-12T05:30:23.070 回答
8

绑定源在 TextBox Validated 事件上更新。当用户编辑 TextBox 然后将焦点更改为其他控件时,将调用 TextBox 验证事件。由于您正在以编程方式更改 TextBox 文本,因此 TextBox 不知道文本已更改,因此不会调用验证并且不会更新绑定,因此您需要手动更新绑定。

初始化绑定:

var entity;
textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty");

更改 TextBox.Text:

textBox.Text = "SOME_VALUE";

手动更新绑定:

textBox.DataBindings["textBoxProperty"].WriteValue();

Binding.WriteValue() 从控件中读取值并相应地更新实体。您可以在MSDN阅读有关 WriteValue 的信息。

于 2013-10-19T17:24:02.537 回答
1

订阅者未初始化。IE

private DerivedEntity derivedEntity
TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname");

derivedEntity一片空白。

初始化它,你会没事的。

于 2016-02-12T18:02:41.603 回答
0

我实现了“INotifyPropertyChanged”,但仅在新值与旧值不同时引发 PropertyChanged 事件:

public class ProfileModel : INotifyPropertyChanged
{
    private Guid _iD;
    private string _name;
    public event PropertyChangedEventHandler PropertyChanged;

    public Guid ID
    {
        get => _iD;
        set
        {
            if (_iD != value)
            {
                _iD = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ID"));
            }
        }
    }

    public string Name
    {
        get => _name;
        set
        {
            if (_name != value)
            {
                _name = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }
}

现在只需绑定到控件:

txtProfileID.DataBindings.Clear();
txtProfileID.DataBindings.Add("Text", boundProfile, "ID", true, DataSourceUpdateMode.OnPropertyChanged);
于 2018-05-30T08:47:09.757 回答