Comment faire en sorte qu'une liaison de données se mette à jour dès qu'un nouveau caractère est tapé dans un TextBox ?
Je suis en train de me familiariser avec les liaisons dans WPF et je me retrouve bloqué sur une question (que j'espère) simple.
J'ai une classe FileLister simple où vous pouvez définir une propriété Path, et ensuite elle vous donnera une liste de fichiers lorsque vous accédez à la propriété FileNames. Voici cette classe :
class FileLister:INotifyPropertyChanged {
private string _path = "";
public string Path {
get {
return _path;
}
set {
if (_path.Equals(value)) return;
_path = value;
OnPropertyChanged("Path");
OnPropertyChanged("FileNames");
}
}
public List<String> FileNames {
get {
return getListing(Path);
}
}
private List<string> getListing(string path) {
DirectoryInfo dir = new DirectoryInfo(path);
List<string> result = new List<string>();
if (!dir.Exists) return result;
foreach (FileInfo fi in dir.GetFiles()) {
result.Add(fi.Name);
}
return result;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(property));
}
}
}
J'utilise le FileLister comme une StaticResource dans cette application très simple :
<Window x:Class="WpfTest4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTest4"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:FileLister x:Key="fileLister" Path="d:\temp" />
</Window.Resources>
<Grid>
<TextBox Text="{Binding Source={StaticResource fileLister}, Path=Path, Mode=TwoWay}"
Height="25" Margin="12,12,12,0" VerticalAlignment="Top" />
<ListBox Margin="12,43,12,12" Name="listBox1" ItemsSource="{Binding Source={StaticResource ResourceKey=fileLister}, Path=FileNames}"/>
</Grid>
</Window>
La reliure fonctionne. Si je modifie la valeur de la zone de texte et que je clique en dehors de celle-ci, le contenu de la zone de 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 perde le focus.
Comment puis-je faire ça ? Y a-t-il un moyen de le faire directement dans le xaml, ou dois-je gérer les événements TextChanged ou TextInput sur la boîte ?