【问题标题】:How do I find what text had been added with TextChanged如何找到使用 TextChanged 添加的文本
【发布时间】:2018-04-27 16:15:17
【问题描述】:

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

到目前为止,我已经使用了 TextChangedEventArgs.Changes,并获得了其中项目的属性 (ICollection)。

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

【问题讨论】:

  • 跟踪更改是否重要,还是只是最终值重要?我建议在后一种情况下使用 DataBinding
  • @ErnodeWeerd 你能解释一下吗?

标签: wpf textbox textchanged


【解决方案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 = "";
            }
        }
    }

【讨论】:

  • 想了想,但是如果文本的变化是在文本框的中间呢?我的意思是,更改不必在文本框的结尾
  • 它只会给你添加文本的长度
  • 如果字符已更改但未添加或删除,它也可以工作
【解决方案2】:

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));
    }
}

虽然这对于一个简单的场景来说看起来很复杂,但它有很多优点:

  • 您可以在不创建 UI 的情况下为 ViewModel 编写自动化(单元)测试
  • 添加额外的字段和逻辑很简单
  • 如果 UI 需要更改,ViewModel 并不总是需要更改

该机制的核心是 Xaml 中的 {Binding ...} 位,它告诉 WPF 在 TextBox 的 Text 属性和分配给 DataContext 的对象的 SomeText 属性之间同步数据。 其他重要位是: - 在窗口的构造函数中设置 DataContext 和 - 在 ViewModel 中,当 SomeText 属性更改时引发 PropertyChanged 事件,以便通知绑定。

请注意,这只是 DataBinding 的一个基本示例,可以在此代码中进行许多改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多