A due vie databinding in winforms, Inotifypropertychanged implementato nella classe base

Uso .Net 3.5, Winforms, Databinding

Ho derivato classi, la classe base implementa IPropertychanged

    public event PropertyChangedEventHandler PropertyChanged;

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

Ogni propertysetter chiamate:

    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);
        }
    }

Un tipico Propertysetter:

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

Il modo in cui una proprietà è legata ad una textbox

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

Se a livello di programmazione assegnare il testo nella casella di testo, casella di testo non mostra. Ma posso modificare manualmente la casella di testo.

Winforms Databind, non ho mai sentito parlare di che, ma sicuramente im principiante 🙂

OriginaleL’autore traveller | 2013-10-19

4 Replies
  1. 8

    Origine dell’associazione è aggiornato sulla TextBox Convalidato evento. TextBox convalidato evento viene chiamato quando l’utente modifica casella di testo e quindi cambia l’attenzione ad altri di controllo.
    Dal momento che si sta cambiando TextBox testo a livello di programmazione TextBox non sapere che il testo sono state modificate, e quindi la convalida non viene chiamato e vincolante non è aggiornato, quindi è necessario aggiornare associazione manualmente.

    Inizializzare rilegatura:

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

    Modificare La Casella Di Testo.Testo:

    textBox.Text = "SOME_VALUE";

    Aggiornamento vincolante manualmente:

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

    Associazione.WriteValue() legge il valore di controllo e gli aggiornamenti entità di conseguenza.
    Si può leggere su WriteValue a MSDN.

    OriginaleL’autore Ryogo

  2. 8

    So che è troppo tardi per rispondere, ma questo problema può essere risolto, se si imposta un evento quando il vostro legame dovrebbe cambiare il valore, se impostata sul valore della proprietà di evento di cambiare il vostro problema sarà risolto. Si può fare questo in questo modo

    textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty", true, DataSourceUpdateMode.OnPropertyChanged);
    u può postare un piccolo codice di lavoro per textbox due dati in modo vincolante. solo guardando il tuo codice potrebbe non visualizzare come realizzarla ?
    Si prega di fare riferimento a questa domanda stackoverflow.com/questions/1616003/data-binding-for-textbox.
    grazie per la risposta.come potrei associare altri controlli caselle di controllo, pulsanti radio e a tendina etc. voglio associare questi di controllo in un modo, come risultato, quando i dati saranno cambiamenti nel datasource poi cambiato dovrebbe riflettersi a livello di controllo. u può aiutarmi con il codice di esempio di come si legano questi controlli con i dati checkboxes, radio button and dropdown etc
    è possibile associare un valore di proprietà della casella di controllo e comandi radio. come in questo modo casella di controllo.DataBindings.Add(“Value”, entità, “entityProperty”, true, DataSourceUpdateMode.OnPropertyChanged);
    Se si dispone di databound combobox, è possibile associare SelectedItem di Combobox come questo modo la casella di controllo.DataBindings.Add(“SelectedItem”, entità, “entityProperty”, true, DataSourceUpdateMode.OnPropertyChanged).

    OriginaleL’autore Haider Ali Wajihi

  3. 1

    Il sottoscrittore non è inizializzato. cioè

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

    derivedEntity è null.

    Inizializzare e ti troverai bene.

    OriginaleL’autore SohoNYC75

  4. 0

    Ho implementato il “INotifyPropertyChanged”, ma alzare l’evento PropertyChanged solo quando il nuovo valore è diverso dal valore storico:

    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"));
                }
            }
        }
    }

    Ora basta associare ai controlli:

    txtProfileID.DataBindings.Clear();
    txtProfileID.DataBindings.Add("Text", boundProfile, "ID", true, DataSourceUpdateMode.OnPropertyChanged);

    OriginaleL’autore Cristian Oprea

Lascia un commento