gpt4 book ai didi

c# - 为什么 KeyDown 事件无法访问绑定(bind)变量的当前值?

转载 作者:行者123 更新时间:2023-11-30 22:46:40 26 4
gpt4 key购买 nike

在下面的例子中:

  • 我启动程序,键入文本,单击按钮,查看上面的文本。按 ENTER 再次查看文本。

但是:

  • 我启动程序,输入文本,按ENTER,看到没有文本。

似乎 KeyDown 事件无法访问绑定(bind)变量的当前值,就好像它总是“落后”。

我必须更改什么才能在按下 ENTER 时访问文本框中的值,以便将其添加到聊天窗口?

alt text 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>

代码隐藏:

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

最佳答案

您的文本框->属性绑定(bind)仅在文本框失去焦点后发生。当您输入文本并按回车键时,您还没有将焦点设置在表单的其他任何位置。您可以通过输入文本、单击滚动查看器、然后返回文本框并按回车键来演示这一点。然后您将在查看器中看到您的文本发生变化。

要解决这个问题,请将文本框的 Text 属性更新为此。

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

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

查看页面下方大约四分之一的位置:如何让我的数据绑定(bind) TextBox 在我键入时更新源值?

关于c# - 为什么 KeyDown 事件无法访问绑定(bind)变量的当前值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2529992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com