0

几天前,我意识到在 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() 方法上。

有人知道如何将基类中的方法分配给事件吗?或者我真的必须在我拥有的每个视图中重复此代码吗?

4

1 回答 1

1

为了始终更新任何 texbox 上的绑定(为了验证每个 KeyPress 中的错误),我需要在系统中的每个 TextBox 中的 TextChanged Event 事件上使用此代码

你试过UpdateSourceTrigger.PropertyChanged吗?

<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
于 2012-09-17T13:51:09.950 回答