在我的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
答案 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对这个问题的回答。