¿Cómo puedo hacer una actualización de enlace de datos tan pronto como se escribe un nuevo carácter en un TextBox?
Estoy aprendiendo sobre encuadernaciones en WPF y ahora me he quedado atascado en un (ojalá) simple asunto.Haciendo que un WPF TextBox encienda fuego en cada nuevo personaje?
Tengo una clase FileLister simple donde puede establecer una propiedad de ruta, y luego le dará una lista de archivos cuando acceda a la propiedad FileNames. aquí es que la clase:
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));
}
}
}
estoy usando el de la FileLister como StaticResource en esta aplicación muy 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 unión está trabajando. Si cambio el valor en el cuadro de texto y luego hago clic fuera de él, el contenido del cuadro de lista se actualizará (siempre que exista la ruta).
El problema es que me gustaría actualizar tan pronto como se escriba un nuevo carácter, y no esperar hasta que el cuadro de texto pierda el foco.
¿Cómo puedo hacer eso? ¿Hay alguna manera de hacerlo directamente en el xaml, o tengo que manejar eventos TextChanged o TextInput en el cuadro?
Gracias! Exactamente la solución más simple que esperaba :) – luddet
Para mí no funcionó ... Quiero que el texto vuelva a su valor anterior, en caso de que no sea un número. Solo cuando se agregó IsAsync = True, funcionó. – ilans