Как я могу обновить привязку данных, как только в TextBox вводится новый символ?
Я изучаю привязки в WPF, и теперь я застрял в (надеюсь) простом вопросе.
У меня есть простой класс FileLister, в котором вы можете установить свойство Path, а затем он предоставит вам список файлов при доступе к свойству FileNames. Вот этот класс:
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 в поле?
Вы должны установить
UpdateSourceTrigger
свойство наPropertyChanged
<TextBox Text="{Binding Source={StaticResource fileLister}, Path=Path, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="25" Margin="12,12,12,0" VerticalAlignment="Top"/>
источник
Без C # в XAML достаточно для TextBox, а не для класса. Итак, отслеживая свойство TextBlock, где длина записи TextBox: Binding Text.Length
<StackPanel> <TextBox x:Name="textbox_myText" Text="123" /> <TextBlock x:Name="tblok_result" Text="{Binding Text.Length, ElementName=textbox_myText}"/> </StackPanel>
источник
Внезапно возникли проблемы с привязкой данных между слайдером и связанным TextBox. Наконец-то я нашел причину и смог ее исправить. Конвертер, который я использую:
using System; using System.Globalization; using System.Windows.Data; using System.Threading; namespace SiderExampleVerticalV2 { internal class FixCulture { internal static System.Globalization.NumberFormatInfo currcult = Thread.CurrentThread.CurrentCulture.NumberFormat; internal static NumberFormatInfo nfi = new NumberFormatInfo() { /*because manual edit properties are not treated right*/ NumberDecimalDigits = 1, NumberDecimalSeparator = currcult.NumberDecimalSeparator, NumberGroupSeparator = currcult.NumberGroupSeparator }; } public class ToOneDecimalConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { double w = (double)value; double r = Math.Round(w, 1); string s = r.ToString("N", FixCulture.nfi); return (s as String); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { string s = (string)value; double w; try { w = System.Convert.ToDouble(s, FixCulture.currcult); } catch { return null; } return w; } } }
В XAML
<Window.Resources> <local:ToOneDecimalConverter x:Key="ToOneDecimalConverter"/> </Window.Resources>
далее определенный TextBox
<TextBox x:Name="TextSlidVolume" Text="{Binding ElementName=SlidVolume, Path=Value, Converter={StaticResource ToOneDecimalConverter},Mode=TwoWay}" />
источник