Wpf 如何查找添加了TextChanged的文本

Wpf 如何查找添加了TextChanged的文本,wpf,textbox,textchanged,Wpf,Textbox,Textchanged,我希望在文本框中的文本和变量中的字符串之间进行同步。我发现了如何获取文本框中字符串被更改的索引、添加的长度和删除的长度,但是我如何才能找到添加的字符串呢 到目前为止,我已经使用了textchangedventargs.Changes,并获得了ICollection中项目的属性 我正在尝试创建一个密码框,在其中我可以通过函数显示实际密码。因此,我不希望文本框直接同步,例如,在文本框中会出现****和字符串hello。如果只希望添加文本,可以这样做 string AddedText; priva

我希望在文本框中的文本和变量中的字符串之间进行同步。我发现了如何获取文本框中字符串被更改的索引、添加的长度和删除的长度,但是我如何才能找到添加的字符串呢

到目前为止,我已经使用了textchangedventargs.Changes,并获得了ICollection中项目的属性


我正在尝试创建一个密码框,在其中我可以通过函数显示实际密码。因此,我不希望文本框直接同步,例如,在文本框中会出现****和字符串hello。

如果只希望添加文本,可以这样做

 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 = "";
            }
        }
    }
编辑

如果要添加和删除所有文本,可以执行此操作

 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 = "";
            }
        }
    }

数据绑定是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>
以及保存要显示和收集的数据的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));
    }
}
虽然对于一个简单的场景来说这看起来很复杂,但它有很多优点:

您可以为ViewModel编写自动单元测试,而无需创建UI 添加额外的字段和逻辑很简单 如果UI需要更改,则ViewModel并不总是需要更改 该机制的核心是Xaml中的{Binding…}位,它告诉WPF在TextBox的Text属性和分配给DataContext的对象的SomeText属性之间同步数据。 其他有效位为: -在窗口的构造函数中,DataContext和 -在ViewModel中,当SomeText属性更改时引发PropertyChanged事件,以便通知绑定


请注意,这只是数据绑定的一个基本示例,在这段代码中可以做很多改进。

跟踪更改是重要的还是最终值重要?我建议在后者中使用数据绑定case@ErnodeWeerd你能解释一下吗?想想看,但是如果文本的变化在文本框的中间怎么办?我的意思是,改变不一定要在文本框的结尾,它只会给你增加文本的长度。如果一个字符被改变,而不是被添加或删除,它也会起作用