【发布时间】:2014-02-28 07:36:42
【问题描述】:
假设我有 texbox 和 textblock:
<TextBox Name="textBox1"
Text="{Binding Path=user,
RelativeSource={RelativeSource FindAncestor,
AncestorType=my:MainWindow, AncestorLevel=1},
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Name="textBlock1"
Text="{Binding Path=user,
RelativeSource={RelativeSource FindAncestor,
AncestorType=my:MainWindow, AncestorLevel=1},
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
后面的代码:
private string _user = "a";
public string user
{
get
{
return _user;
}
set
{
if (!String.IsNullOrEmpty(value.Trim()))
_user = value;
//else
//_user = _user + Environment.NewLine;
NotifyPropertyChanged("user");
}
}
我想要实现的 - 不允许用户在文本框和文本块中输入空字符串(或空格)。如果文本为空 - 我只是恢复以前的值(由用户文本清除 - 在我的代码的情况下为“a”)。
上面的代码非常适合文本块,但不适用于文本框(在文本框内按退格键后的屏幕截图):
此外,如果您从
中删除评论 //else
//_user = _user + Environment.NewLine;
一切都像魅力一样(当然,除了我需要恢复以前的值,而不是 Environment.NewLine 的值 :))
那么发生了什么?为什么文本框的行为与预期的差异很大(甚至与文本块的行为不同)?
更新:
我的期望:
如果我在文本框中按退格键,我的表达式!String.IsNullOrEmpty(value.Trim()) 是假的。
_user 未更新(仍为“a”)。
在下一行调用 NotifyPropertyChanged("user") 应该强制绑定以获取“a”(如果我在 getter 中切换断点,_user 等于“a”)。
但正如您在屏幕截图中看到的那样 - 文本框由于某种原因是空的。
【问题讨论】:
-
奇怪的 RelativeSource 绑定有什么问题 - 我认为您可以完全删除不需要指定源的内容 - DataContext 自动成为 Window 本身。
-
我看不到问题 - 如果您在文本框中按退格键,您的表达式:
!String.IsNullOrEmpty(value.Trim())将为 false,因此 _user 不会更新,因此当绑定再次获取它时,它仍然是“a”! -
你不能输入
TextBlock所以你怎么能更新它的值——它永远不会调用set! -
@markmnl 如果我在文本框中按退格键,我的表达式:
!String.IsNullOrEmpty(value.Trim())是假的。 _user 没有更新(它仍然是“a”)。在下一行调用NotifyPropertyChanged("user")应该强制绑定获取“a”(如果我在 setter 中切换断点,情况就是如此)。但正如您在屏幕截图中看到的那样 - 文本框由于某种原因是空的。我已经更新了我的问题。 -
@markmnl 删除
RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}使绑定对我不起作用。不知道为什么,但 DataContext 自动是 Window 本身在我的情况下不是正确的陈述
标签: c# wpf data-binding textbox