几天前,我意识到在 Silverlight 中,为了始终更新任何 texbox 上的绑定(以验证每个 KeyPress 中的错误),我需要在系统中的每个TextBox 中的 TextChanged Event 事件上使用以下代码:
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() 方法上。
有人知道如何将基类中的方法分配给事件吗?或者我真的必须在我拥有的每个视图中重复此代码吗?