Silverlight文本框绑定TextChanged事件

时间:2013-09-05 21:52:26

标签: silverlight

我有一个简单的Silverlight TextBox,它通过条形码扫描仪接收文本。它基本上像一个粘贴。无论如何,我希望我的TextBox在注意到其内容发生变化时,在我的ViewModel中运行LoadScannedResults()。默认情况下,当我执行TwoWay绑定时,当我单击离开页面时,会触发ViewModel中的ScanDocumentNumber。如果我将tbDocumentNumber_TextChanged()放入我的代码隐藏中,然后我按两次ViewModel - 一次在TextChanged上,然后再单击离开页面时,我可以获得预期的效果。我希望它只发生在TextChanged上。谢谢你的帮助!

这是我的Home.xaml

<TextBox Name="tbDocumentNumber" Margin="3" VerticalAlignment="Center" Text="{Binding ScanDocumentNumber, Mode=TwoWay}" Width="150" />

这是我的Home.xaml.cs

public Home()
{
    m_DataContext = HomeViewModel.Current;
    this.DataContext = m_DataContext;

    InitializeComponent();

    tbDocumentNumber.TextChanged += new TextChangedEventHandler(tbDocumentNumber_TextChanged);
}

private void tbDocumentNumber_TextChanged(object sender, TextChangedEventArgs e)
{
    object focusObj = FocusManager.GetFocusedElement();
    if (focusObj != null && focusObj is TextBox)
    {
        var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
        binding.UpdateSource();
        tbDocumentNumber.SelectAll();
    }
}

这是我的HomeViewModel.cs

private string m_ScanDocumentNumber;
public string ScanDocumentNumber
{
    get { return m_ScanDocumentNumber; }
    set
    {
        if (m_ScanDocumentNumber == null || !m_ScanDocumentNumber.Equals(value))
        {
            m_ScanDocumentNumber = value.Trim();
            RaisePropertyChanged("ScanDocumentNumber");
        }
        if (m_ScanDocumentNumber != null && m_ScanDocumentNumber != "")
        {
            LoadScannedResults();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我不确定,但在这种情况下,UpdateSourceTrigger可能会有所帮助。

TextBox.Text属性的默认UpdateSourceTrigger值为LostFocus。这意味着如果应用程序具有带有数据绑定TextBox.Text属性的TextBox,则在TextBox失去焦点之前,您在TextBox中键入的文本不会更新源(例如,当您单击远离TextBox时)。

如果要在输入时更新源,请将绑定的UpdateSourceTrigger设置为PropertyChanged。在以下示例中,TextBox和TextBlock的Text属性绑定到同一源属性。 TextBox绑定的UpdateSourceTrigger属性设置为PropertyChanged。

<TextBox Name="itemNameTextBox"
         Text="{Binding Path=ItemName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />