获取列表框中动态生成的文本框的值,Windows Phone 8

时间:2013-11-27 11:19:34

标签: vb.net xaml windows-phone-8 textbox listbox

在我的Windows Phone 8应用程序中,我有一个ListBox控件。此列表框包含一个网格,其中包含一对TextBlock(字段标题)和TextBox(用户输入)控件。此列表基于应用程序连接的服务结果生成。我需要做的是访问列表中的每个文本框,并带回它的值。为此,我将每个项的唯一ID绑定到TextBox的Tag属性,并且我使用LostFocus事件来捕获用户输入。一旦捕获并将其添加到后面代码中的集合中,当用户单击列表下的按钮时,将处理数据。这适用于除最后一个项目之外的每个项目。

问题是如果单击按钮,则LostFocus不起作用。按钮单击方法似乎优先于文本框LostFocus方法。因此,如果列表中只有1个项目,则不会记录该值。这是代码:

<ItemsControl x:Name="itmScreen4">
    <TextBlock Margin="0,10,0,10">Fields</TextBlock>
    <ListBox x:Name="lstCustom" ItemsSource="{Binding}" Visibility="Visible">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="grdCustom">                                                          
                <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" x:Name="txtCustTitle" Text="{Binding Name}" Foreground="#4C4C4C" FontSize="18" Margin="0,15,0,0"></TextBlock>           
                <TextBox Tag="{Binding DataID}" x:Name="txtCust" Grid.Row="1" Style="{StaticResource TextBox}" Width="450"  LostFocus="txtCust_LostFocus"></TextBox>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button x:Name="btnSubmit" Content="Submit" Background="#404040"></Button>
</ItemsControl>

对于列表中的最后一项(或者如果列表中只有一个项目),调用btnSubmit方法时不会调用txtCust_LostFocus方法。关于如何捕获最终文本框值的任何想法?

我已经尝试了一些其他方法(例如,在其上投射ListBoxItem并对其执行FindName),但是没有找到任何有效的方法。谷歌也没有多少帮助。提前谢谢。

编辑:

这是背后的代码。我将自定义类绑定到列表,如下所示。

这里的类定义(为了可读性,我删除了一些属性):

Public Class CustomDataRequest
    Public Sub New()
    End Sub

    Public Property ID As Integer        
    Public Property Name As String        

End Class

在此处的代码中使用:

Public Sub ShowCustomData()          
        Dim CustomDataList As New List(Of CustomDataRequest)()

        For Each item In _CustomDataRequestList
            If item.ID= _CurrentID Then
                CustomDataList.Add(item)
            End If
        Next

        lstCustom.ItemsSource = CustomDataList.ToArray

    End Sub

txtCust_LostFocus方法只是在分钟捕获字段。一旦我可以实际调用它,我就可以将数据添加到集合中:

Private Sub txtCust_LostFocus(sender As Object, e As RoutedEventArgs)
        Dim elem = DirectCast(sender, FrameworkElement)
        Dim txt = DirectCast(elem.FindName("txtCust"), TextBox)

        Dim text As String = txt.Text
        Dim tag As String = txt.Tag

    End Sub

问题是一旦点击按钮就永远不会被调用:

Protected Sub btnSubmit_Tap(sender As Object, e As Input.GestureEventArgs) Handles btnSubmit.Tap
        ValidateData()

    End Sub

1 个答案:

答案 0 :(得分:0)

以下是答案。 TextBox应该设置TwoWay绑定模式,以将文本值绑定到类中相应的Value属性。它还应该将UpdateSourceTrigger设置为Explicit以提高绑定效率,详见here

Public Class CustomDataRequest
    Public Sub New()
    End Sub

    Public Property ID As Integer        
    Public Property Name As String   
    'New property here
    Public Property Value As String

End Class

文本框代码:

<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=Explicit}" x:Name="txtCust" Grid.Row="1" BorderBrush="#BBBBBB" Style="{StaticResource TextBox}" Width="450" TextChanged="Textbox_Changed"></TextBox>

在后面的代码中,应该从Textbox TextChanged(翻译成VB)调用以下方法:

Private Sub Textbox_Changed(sender As Object, e As TextChangedEventArgs)
        Dim txt As TextBox = TryCast(sender, TextBox)           
        Dim bindingExpr As BindingExpression = txt.GetBindingExpression(TextBox.TextProperty)
        bindingExpr.UpdateSource()

    End Sub

这解决了当焦点仍在文本框上时文本框值无法绑定的问题。感谢venerik对这个问题的回答。