Wie kann ich eine Datenbindungsaktualisierung durchführen, sobald ein neues Zeichen in eine Textbox eingegeben wird?
Ich lerne etwas über Bindungen in WPF und bin jetzt in einer (hoffentlich) einfachen Sache festgefahren.
Ich habe eine einfache FileLister-Klasse, in der Sie eine Path-Eigenschaft festlegen können. Anschließend erhalten Sie eine Liste der Dateien, wenn Sie auf die FileNames-Eigenschaft zugreifen. Hier ist diese Klasse:
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));
}
}
}
Ich verwende den FileLister als StaticResource in dieser sehr einfachen App:
<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>
Die Bindung funktioniert. Wenn ich den Wert im Textfeld ändere und dann außerhalb klicke, wird der Inhalt des Listenfelds aktualisiert (solange der Pfad vorhanden ist).
Das Problem ist, dass ich aktualisieren möchte, sobald ein neues Zeichen eingegeben wird, und nicht warten möchte, bis das Textfeld den Fokus verliert.
Wie kann ich das machen? Gibt es eine Möglichkeit, dies direkt in der xaml zu tun, oder muss ich TextChanged- oder TextInput-Ereignisse auf der Box verarbeiten?