В приведенном ниже примере:
- Я запускаю программу, набираю текст, нажимаю кнопку , см. Текст выше. Нажмите 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
}
}