Làm cách nào để cập nhật liên kết dữ liệu ngay sau khi một ký tự mới được nhập vào TextBox?
Tôi đang tìm hiểu về các ràng buộc trong WPF và bây giờ tôi gặp khó khăn về một vấn đề (hy vọng) đơn giản.
Tôi có một lớp FileLister đơn giản, nơi bạn có thể đặt thuộc tính Đường dẫn và sau đó nó sẽ cung cấp cho bạn danh sách các tệp khi bạn truy cập thuộc tính FileNames. Đây là lớp đó:
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));
}
}
}
Tôi đang sử dụng FileLister làm StaticResource trong ứng dụng rất đơn giản này:
<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>
Ràng buộc đang hoạt động. Nếu tôi thay đổi giá trị trong hộp văn bản và sau đó nhấp vào bên ngoài nó, nội dung hộp danh sách sẽ cập nhật (miễn là đường dẫn tồn tại).
Vấn đề là tôi muốn cập nhật ngay sau khi một ký tự mới được nhập, và không đợi cho đến khi hộp văn bản mất tiêu điểm.
Làm thế nào tôi có thể làm điều đó? Có cách nào để thực hiện việc này trực tiếp trong xaml hay tôi phải xử lý các sự kiện TextChanged hoặc TextInput trên hộp không?