जैसे ही टेक्स्टबॉक्स में एक नया चरित्र टाइप किया जाता है, मैं डेटा बाइंडिंग अपडेट कैसे कर सकता हूं?
मैं WPF में बाइंडिंग के बारे में सीख रहा हूं और अब मैं एक (उम्मीद) सरल मामले पर अटक गया हूं।
मेरे पास एक साधारण फाइललिस्टर क्लास है जहाँ आप एक पथ संपत्ति सेट कर सकते हैं, और तब यह आपको फाइलों की एक सूची देगा जब आप फ़ाइलनाम संपत्ति का उपयोग करते हैं। यहाँ वह वर्ग है:
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));
}
}
}
मैं इस बहुत ही साधारण ऐप में FileLister को StaticResource के रूप में उपयोग कर रहा हूं:
<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>
बंधन काम कर रहा है। यदि मैं टेक्स्टबॉक्स में मान बदलता हूं और फिर इसके बाहर क्लिक करता हूं, तो सूची बॉक्स सामग्री अपडेट हो जाएगी (जब तक पथ मौजूद है)।
समस्या यह है कि मैं एक नया चरित्र टाइप करते ही अपडेट करना चाहूंगा, और तब तक इंतजार नहीं करूंगा जब तक कि टेक्स्टबॉक्स फोकस खो न जाए।
मैं उसे कैसे कर सकता हूँ? वहाँ सीधे xaml में ऐसा करने का एक तरीका है, या क्या मुझे बॉक्स पर TextChanged या TextInput घटनाओं को संभालना है?