Faire un lien WPF TextBox sur chaque nouveau personnage?

Comment puis-je effectuer une mise à jour de liaison de données dès qu’un nouveau caractère est saisi dans une zone de texte?

J’apprends les liaisons dans WPF et maintenant je suis coincé sur une question simple (espérons-le).

J’ai une classe FileLister simple dans laquelle vous pouvez définir une propriété Path, puis vous obtiendrez une liste de fichiers lorsque vous accédez à la propriété FileNames. Voici cette classe:

class FileLister:INotifyPropertyChanged { private ssortingng _path = ""; public ssortingng Path { get { return _path; } set { if (_path.Equals(value)) return; _path = value; OnPropertyChanged("Path"); OnPropertyChanged("FileNames"); } } public List FileNames { get { return getListing(Path); } } private List getListing(ssortingng path) { DirectoryInfo dir = new DirectoryInfo(path); List result = new List(); if (!dir.Exists) return result; foreach (FileInfo fi in dir.GetFiles()) { result.Add(fi.Name); } return result; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(ssortingng property) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(property)); } } } 

J’utilise le FileLister en tant que StaticResource dans cette application très simple:

          

La liaison fonctionne. Si je change la valeur dans la zone de texte et que je clique en dehors de celle-ci, le contenu de la liste sera mis à jour (tant que le chemin existe).

Le problème est que je voudrais mettre à jour dès qu’un nouveau caractère est tapé, et ne pas attendre que la zone de texte perd le focus.

Comment puis je faire ça? Y at-il un moyen de le faire directement dans xaml, ou dois-je gérer des événements TextChanged ou TextInput sur la boîte?

    Dans votre liaison de zone de texte, il vous suffit de définir UpdateSourceTrigger=PropertyChanged .

    Vous devez définir la propriété UpdateSourceTrigger à PropertyChanged

      

    Soudain, la liaison de données entre le curseur et la zone de texte associée a causé des problèmes. Enfin, j’ai trouvé la raison et je pourrais la réparer. Le convertisseur que j’utilise:

     using System; using System.Globalization; using System.Windows.Data; using System.Threading; namespace SiderExampleVerticalV2 { internal class FixCulture { internal static System.Globalization.NumberFormatInfo currcult = Thread.CurrentThread.CurrentCulture.NumberFormat; internal static NumberFormatInfo nfi = new NumberFormatInfo() { /*because manual edit properties are not treated right*/ NumberDecimalDigits = 1, NumberDecimalSeparator = currcult.NumberDecimalSeparator, NumberGroupSeparator = currcult.NumberGroupSeparator }; } public class ToOneDecimalConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { double w = (double)value; double r = Math.Round(w, 1); ssortingng s = r.ToSsortingng("N", FixCulture.nfi); return (s as Ssortingng); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { ssortingng s = (ssortingng)value; double w; try { w = System.Convert.ToDouble(s, FixCulture.currcult); } catch { return null; } return w; } } } 

    En XAML

        

    plus loin la zone de texte définie