以编程方式添加 Interaction.Behavior

3

我正在尝试创建一个适用于Windows Phone 8(Silverlight)的文本框,其行为类似于普通文本框,但具有特殊行为。
这个特殊行为是当用户输入时,即时更新ViewModel,而不是等到文本框失去焦点时才更新。
这是我现在拥有并且正在运作的。

<TextBox Text="{Binding Path=Email,Mode=TwoWay}" InputScope="EmailNameOrAddress">
    <i:Interaction.Behaviors>
        <helpers:UpdateTextBindingOnPropertyChanged />
    </i:Interaction.Behaviors>
</TextBox> 

我希望创建一个FastTextbox子类,该子类的默认行为是文本框中的内容快速输入。
我如何通过编程方式添加此行为?

我尝试了以下代码:

public class FastTextbox:System.Windows.Controls.TextBox
{
    public FastTextbox()
    {
        BehaviorCollection Behaviors= Interaction.GetBehaviors(this);
        Behaviors.Add(new UpdateTextBindingOnPropertyChanged());
    }
}

但是我的行为出现了错误。
我使用的行为使用以下代码来确定其表达式(失败了)。
protected override void OnAttached()
{
    base.OnAttached();

    // expression gets null here :(
    _expression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);
    AssociatedObject.TextChanged += OnTextChanged;
}

我该怎么做呢?

你是不是在 TextBox 构造函数中漏掉了 InitializeComponent? - csharpwinphonexaml
@verdesrobert:(免责声明:我不为WP7/8编程,但假设他们的Silverlight框架提供类似于桌面版本的API)InitializeComponent仅适用于用户控件。 - Martin
2个回答

1

实际解决方案非常简单 :)

    public FastTextbox()
    {
        TextChanged += OnTextBoxTextChanged;
    }

    private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox senderText = (TextBox)sender;
        BindingExpression bindingExp = senderText.GetBindingExpression(TextProperty);
        bindingExp.UpdateSource();
    }

1
问题是:只要您没有对FastTextbox.Text属性设置任何绑定,GetBindingExpression将返回null。这是完全正确的行为。还没有绑定表达式。

[编辑] 一个解决方案可能是:也许有一个OnTextChanged或OnTextPropertyChanged的重载,您可以在那里调用GetBindingExpression方法。

[编辑2] 您能使用Text="{Binding Path=Email, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"吗?那么就不需要FastTextbox了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接