我希望在文本框中的文本和变量中的字符串之间进行同步。我找到了如何获取字符串更改的索引(在文本框中),添加的长度和删除的长度,但我怎样才能真正找到添加的字符串?
到目前为止,我已经使用了TextChangedEventArgs.Changes,并获得了其中项目的属性(ICollection)。
我正在尝试创建一个密码框,在其中我可以通过函数显示实际密码。因此我不希望文本框直接同步(例如,在文本框中会出现“*****”和字符串“hello”)。
答案 0 :(得分:1)
如果您只想添加文字,可以执行此操作
string AddedText;
private void textbox_TextChanged(object sender, TextChangedEventArgs e)
{
var changes = e.Changes.Last();
if (changes.AddedLength > 0)
{
AddedText = textbox.Text.Substring(changes.Offset,changes.AddedLength);
}
}
修改强>
如果您想要添加和删除所有文字,可以执行此操作
string oldText;
private void textbox_GotFocus(object sender, RoutedEventArgs e)
{
oldText = textbox.Text;
}
string AddedText;
string RemovedText;
private void textbox_TextChanged(object sender, TextChangedEventArgs e)
{
var changes = e.Changes.Last();
if (changes.AddedLength > 0)
{
AddedText = textbox.Text.Substring(changes.Offset, changes.AddedLength);
if (changes.RemovedLength == 0)
{
oldText = textbox.Text;
RemovedText = "";
}
}
if (changes.RemovedLength > 0)
{
RemovedText = oldText.Substring(changes.Offset, changes.RemovedLength);
oldText = textbox.Text;
if (changes.AddedLength == 0)
{
AddedText = "";
}
}
}
答案 1 :(得分:0)
DataBinding是WPF中用于在UI中显示和收集数据的最常用方法
试试这个:
<Window x:Class="WpfApp3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3"
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<TextBox Text="{Binding Path=SomeText, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Left"
Margin="101,83,0,0"
VerticalAlignment="Top"
Width="75" />
<TextBlock Text="{Binding SomeText}"
HorizontalAlignment="Left"
Margin="101,140,0,0"
VerticalAlignment="Top"
Width="75" />
</Grid>
</Window>
窗口代码:
public partial class MainWindow : Window
{
private readonly AViewModel viewModel = new AViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = viewModel;
}
}
ViewModel的代码,用于保存您要显示和收集的数据:
public class AViewModel : INotifyPropertyChanged
{
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
if (Equals(this.someText, value))
{
return;
}
this.someText = value;
this.OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(
[CallerMemberName]string propertyName = null)
{
this.PropertyChanged?.Invoke(
this,
new PropertyChangedEventArgs(propertyName));
}
}
虽然这对于简单的场景看起来很复杂,但它有很多优点:
该机制的核心是Xaml中的{Binding ...}
位,它告诉WPF同步TextBox的Text属性和分配给DataContext的对象的SomeText属性之间的数据。
其他重要部分是:
- 在窗口的构造函数中设置DataContext和
- 在ViewModel中,当SomeText属性发生更改时,会引发PropertyChanged事件,以便通知绑定。
请注意,这只是DataBinding的一个基本示例,可以在此代码中进行许多改进。