我是UWP的新手,我在数据绑定方面也不是很有经验。鉴于我不知道是否有更直接的方法来解决我想要做的事情。
我有一个AutoSuggestBox,其中ItemSource和Text都使用x:Bind
绑定<AutoSuggestBox x:Name="AutoBox" ItemsSource="{x:Bind Path=ViewModel.FilteredNames}" Text="{x:Bind Path=ViewModel.SearchedName, Mode=TwoWay}"/>
我的ViewModel看起来大致如下:
Public Class ViewModel
Inherits BindableBase
Private _searchedName As String
Private _filteredNames As List(Of String)
Public Property SearchedName As String
Get
Return _searchedName
End Get
Set(value As String)
MyBase.SetProperty(Of String)(_searchedName, value, "SearchedName")
End Set
End Property
Public ReadOnly Property FilteredNames As List(Of String)
Get
Return GlobalVariables.DetailsProvider.GetListOfNames(_searchedName)
End Get
End Property
End Class
GlobalVariables-Class基本上是一个Singleton,允许我访问DetailsProvider,而DetailsProvider又包含这个函数:
Public Function GetListOfNames(Optional ByVal filterString As String = "") As List(Of String)
Dim returnNames As New List(Of String)
'Using LINQ to filter what is searched for
Dim filteredNames = From item As InterestingObject In Me
Where item.Name.StartsWith(filterString)
Order By item.Value
Select item.Name Distinct
For Each name In filteredNames
returnNames.Add(name)
Next
Return returnNames
End Function
最后,我的AutoSuggestBox上有TextHhaler的EventHandler:
Private Sub AutoBox_textchanged(sender As AutoSuggestBox, args As AutoSuggestBoxTextChangedEventArgs) Handles AutoBox.TextChanged
ViewModel.SearchedName = sender.Text
'the Code in Question
sender.ItemsSource = ViewModel.FilteredNames
End Sub
这可以按预期工作。
但是:
我认为不断重新绑定ItemsSource并不是DataBinding的全部内容。是否有另一种方法可以触发重新读取ViewModel.FilteredNames属性?
我尝试将其读取和写入并从Viewmodel.SearchedName的Setter中人工“更新”ViewModel.FilteredNames属性,但这会导致重复调用GetListOfNames函数的循环,从而导致堆栈溢出。< / p>
欢迎任何建议。
P.S。:我试图通过删除变量和属性名称中的应用程序上下文来简化我的代码。我希望代码仍然一致: - )