前几天我意识到在Silverlight中,为了始终更新任何texbox上的绑定(为了验证每个KeyPress中的错误),我需要在每个中的TextChanged事件事件上使用此代码我在系统中使用的TextBox:
TextBox txCtl = (TextBox)sender; if (txCtl != null)
{
var be = txCtl.GetBindingExpression(TextBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
}
此代码运行良好(来源:http://forums.silverlight.net/t/51100.aspx/1)。问题是:我不想在CodeBehind的每个视图中重复它,所以我决定创建一个自定义的ViewBase,我会在其上留下这些代码。我所做的只是:
public class ViewBase : ChildWindow
{
protected void tboxTextChanged(object sender, TextChangedEventArgs e)
{
TextBox txCtl = (TextBox)sender; if (txCtl != null)
{
var be = txCtl.GetBindingExpression(TextBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
}
}
}
然后我的视图现在是ViewBase而不是UserControl,所以我也将XAML更改为:
<src:ViewBase x:Class="Oi.SCPOBU.Silverlight.Pages.CadastroClassificacao"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:Oi.SCPOBU.Silverlight.Pages" [...]
最后,在我的文本框中,我留下了引用与往常相同的方法的事件,但现在该方法在ViewBase中,而不是在CodeBehind中:
<TextBox
x:Name="tbxNome"
Width="300"
MaxLength="50"
HorizontalAlignment="Left"
TextChanged="tboxTextChanged"
Text="{Binding DTOClassificacao.Nome, Mode=TwoWay, NotifyOnValidationError=True>
对我来说似乎很简单,但这不起作用。代码编译,但在运行时我得到错误:“消息=无法分配给属性'System.Windows.Controls.TextBox.TextChanged'。[Line:43 Position:37]”,在InitializeComponent()方法上。
有人知道我如何将基类中的方法分配给事件?或者我真的必须在我拥有的每一个视图中重复这段代码吗?
答案 0 :(得分:1)
为了始终更新任何texbox上的绑定(为了 验证每个KeyPress中的错误)我在TextChanged上需要这个代码 我在系统中的每个TextBox中的事件事件
您是否尝试过UpdateSourceTrigger.PropertyChanged
?
<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>