Как мне найти, какой текст был добавлен с TextChanged - PullRequest
0 голосов
/ 27 апреля 2018

Я ищу синхронизацию между текстом в текстовом поле и строкой в ​​переменной. Я нашел, как получить индекс, в котором строка была изменена (в текстовом поле), добавлена ​​длина и удалена длина, но как я могу на самом деле найти добавленную строку?

До сих пор я использовал TextChangedEventArgs.Changes и получил свойства элементов в нем (ICollection).

Я пытаюсь создать поле для пароля, в котором я мог бы показать действительный пароль с помощью функции. следовательно, я не хочу, чтобы текстовое поле синхронизировалось напрямую (например, в текстовом поле появилось бы «*****» и в строке «привет»).

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Привязка данных является наиболее распространенным способом в WPF для отображения и сбора данных в пользовательском интерфейсе

Попробуйте это:

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

Хотя это выглядит сложным для простого сценария, у него есть много преимуществ:

  • Вы можете написать автоматический (модульный) тест для ViewModel без создания пользовательского интерфейса
  • Добавление дополнительных полей и логики тривиально
  • Если пользовательский интерфейс нужно изменить, ViewModel не всегда нужно будет менять

Ядром механизма является бит {Binding ...} в Xaml, который сообщает WPF синхронизировать данные между свойством Text объекта TextBox и свойством SomeText объекта, который назначен DataContext. Другие важные биты: - в конструкторе окна настройка DataContext и - в ViewModel вызывается событие PropertyChanged, когда свойство SomeText изменяется, так что привязка будет уведомлена.

Обратите внимание, что это только базовый пример привязки данных, в этот код можно внести множество улучшений.

0 голосов
/ 27 апреля 2018

Если вы хотите добавить только текст, вы можете сделать это

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