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.
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";
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 leSystem.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.