각각의 새로운 캐릭터에 WPF TextBox 바인딩 불을 붙입니까?
텍스트 상자에 새 문자를 입력하는 즉시 데이터 바인딩 업데이트를 수행하려면 어떻게 해야 합니까?
저는 WPF의 바인딩에 대해 배우고 있으며 이제 (바라건대) 간단한 문제에 빠져 있습니다.
경로 속성을 설정할 수 있는 간단한 FileLister 클래스가 있습니다. 그러면 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를 정적 리소스로 사용하고 있습니다.
<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
.
설정해야 합니다.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로 충분합니다.따라서 TextBlock 속성을 모니터링합니다. 여기서 TextBox: Binding Text의 쓰기 길이는 TextBox: Binding Text입니다.길이
<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 x:Name="TextSlidVolume"
Text="{Binding ElementName=SlidVolume, Path=Value,
Converter={StaticResource ToOneDecimalConverter},Mode=TwoWay}"
/>
언급URL : https://stackoverflow.com/questions/10619596/making-a-wpf-textbox-binding-fire-on-each-new-character
'programing' 카테고리의 다른 글
SQL Server의 IsNull() 함수에 해당하는 C# (0) | 2023.05.07 |
---|---|
깃 저장소에서 이전 기록을 제거하려면 어떻게 해야 합니까? (0) | 2023.05.07 |
formGroup에 대한 Angular2 설정 값 (0) | 2023.05.07 |
Xcode: 프로세스 작업을 가져오지 못했습니다. (0) | 2023.05.07 |
파이썬에 // 연산자에 해당하는 천장이 있습니까? (0) | 2023.05.07 |