web-dev-qa-db-fra.com

Propriété de liaison à contrôler dans Winforms

Quelle est la meilleure façon de lier une propriété à un contrôle de sorte que lorsque la valeur de la propriété est modifiée, la propriété liée du contrôle change avec elle.

Donc, si j'ai une propriété FirstName que je veux lier à la valeur de texte txtFirstName d'une zone de texte. Donc, si je change FirstName en valeur "Stack", la propriété txtFirstName.Text change également en valeur "Stack".

Je sais que cela peut sembler une question stupide, mais j'apprécierai l'aide.

40
cubski

Vous devez implémenter INotifyPropertyChanged et ajouter une liaison à la zone de texte.

Je fournirai un extrait de code C #. J'espère que cela aide

class Sample : INotifyPropertyChanged
{
    private string firstName;
    public string FirstName
    {
        get { return firstName; }
        set
        {
            firstName = value;
            InvokePropertyChanged(new PropertyChangedEventArgs("FirstName"));
        }
    }

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }

    #endregion
}

Utilisation:

 Sample sourceObject = new Sample();
 textbox.DataBindings.Add("Text",sourceObject,"FirstName");
 sourceObject.FirstName = "Stack"; 
47
Stecya

A version simplifiée de la réponse acceptée qui ne vous oblige PAS à taper manuellement les noms des propriétés dans chaque configurateur de propriété comme OnPropertyChanged("some-property-name"). Au lieu de cela, vous appelez simplement OnPropertyChanged() sans paramètres:

Vous avez besoin de .NET 4.5 minimum. CallerMemberName est dans le System.Runtime.CompilerServices espace de noms

public class Sample : INotifyPropertyChanged
{
    private string _propString;
    private int _propInt;


    //======================================
    // Actual implementation
    //======================================
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    //======================================
    // END: actual implementation
    //======================================


    public string PropString
    {
        get { return _propString; }
        set
        {
            // do not trigger change event if values are the same
            if (Equals(value, _propString)) return;
            _propString = value;

            //===================
            // Usage in the Source
            //===================
            OnPropertyChanged();

        }
    }

    public int PropInt
    {
        get { return _propInt; }
        set
        {
            // do not allow negative numbers, but always trigger a change event
            _propInt = value < 0 ? 0 : value;
            OnPropertyChanged();
        }
    }
}

L'utilisation reste la même:

var source = new Sample();
textbox.DataBindings.Add("Text", source, "PropString");
source.PropString = "Some new string";

J'espère que cela aide quelqu'un.

3
Dmitry Avtonomov