Почему событие KeyDown не имеет доступа к текущему значению связанной переменной? - PullRequest
2 голосов
/ 27 марта 2010

В приведенном ниже примере:

  • Я запускаю программу, набираю текст, нажимаю кнопку , см. Текст выше. Нажмите ENTER , чтобы снова увидеть текст.

НО:

  • Я запускаю программу, набираю текст, нажимаю ENTER , см. нет текст.

Похоже, что событие KeyDown не получает доступа к текущему значению связанной переменной, как будто оно всегда " один позади ".

Что мне нужно изменить, чтобы при нажатии клавиши ВВОД у меня был доступ к значению в текстовом поле, чтобы я мог добавить его в окно чата?

альтернативный текст http://www.deviantsart.com/upload/1l20kdl.png

XAML:

<Window x:Class="TestScroll.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="290" Width="300" Background="#eee">
    <StackPanel Margin="10">

        <ScrollViewer Height="200" Width="260" Margin="0 0 0 10"
                      VerticalScrollBarVisibility="Auto"
                      HorizontalScrollBarVisibility="Auto">
            <TextBlock Text="{Binding TextContent}"
                       Background="#fff"/>
        </ScrollViewer>

        <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
            <TextBox x:Name="TheLineTextBox" 
                     Text="{Binding TheLine}" 
                     Width="205" 
                     Margin="0 0 5 0"
                     KeyDown="TheLineTextBox_KeyDown"/>
            <Button Content="Enter" Click="Button_Click"/>
        </StackPanel>

    </StackPanel>
</Window>

Code-Behind:

using System;
using System.Windows;
using System.Windows.Input;
using System.ComponentModel;

namespace TestScroll
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {

        #region ViewModelProperty: TextContent
        private string _textContent;
        public string TextContent
        {
            get
            {
                return _textContent;
            }

            set
            {
                _textContent = value;
                OnPropertyChanged("TextContent");
            }
        }
        #endregion

        #region ViewModelProperty: TheLine
        private string _theLine;
        public string TheLine
        {
            get
            {
                return _theLine;
            }

            set
            {
                _theLine = value;
                OnPropertyChanged("TheLine");
            }
        }
        #endregion

        public Window1()
        {
            InitializeComponent();
            DataContext = this;
            TheLineTextBox.Focus();

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            AddLine();
        }

        void AddLine()
        {
            TextContent += TheLine + Environment.NewLine;
        }

        private void TheLineTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                AddLine();
            }
        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

Ответы [ 3 ]

3 голосов
/ 27 марта 2010

Ваше привязка textbox-> property происходит только после того, как текстовое поле теряет фокус. Когда вы вводите текст и нажимаете ввод, вы не устанавливаете фокус в другом месте формы. Вы можете продемонстрировать это, набрав текст, нажав на просмотрщик прокрутки, затем вернувшись назад в текстовое поле и нажав Enter. После этого вы увидите изменение текста в программе просмотра.

Чтобы обойти это, обновите свойство Text текстового поля до этого.

Text="{Binding TheLine, UpdateSourceTrigger=PropertyChanged}"

http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

См. Примерно четверть пути вниз по странице: Как заставить мой TextBox с привязкой к данным обновлять исходное значение при вводе?

1 голос
/ 27 марта 2010

Работает ли это, если вы измените AddLine на использование TheLineTextBox.Text?

    void AddLine() 
    { 
        TextContent += TheLineTextBox.Text + Environment.NewLine; 
    } 
0 голосов
/ 23 февраля 2012

Этот способ используется для WPF, с другой стороны, при использовании серебряного света свойство UpdateSourceTrigger имеет только явное и стандартное значение.

...