gpt4 book ai didi

vb.net - 从后端刷新时不要触发 ComboBox SelectionChanged

转载 作者:行者123 更新时间:2023-12-03 10:44:17 25 4
gpt4 key购买 nike

我是一个业余程序员,被困在应该很容易完成的事情上……但我没有看到光明:

情况 :一个简单的 XAML/MVVM/VB.Net 应用程序,它为用户提供了一个组合框,其中包含他可以收听的广播电台。选择广播电台时,应用程序会向服务器发送调谐命令以进行进一步处理和实际调谐(使用 LogitechMediaServer/Squeezebox 的人将能够很好地描绘这一点:)

但是 : 也存在通过本应用程序以外的其他方式调入的电台变更的可能性。出于这个原因,存在一个“刷新”按钮来获取当前调谐到广播电台。

示例代码是高度有限的用户控件的一部分。因此,我希望 ComboBox 既可以用作选择器,也可以用作提供当前状态(已调谐到哪个广播电台)的方式。

问题 : 当从服务器刷新状态时,SelectionChanged 事件再次被触发,向服务器发送另一个 Tune 请求。我不希望这种情况发生。我们如何确保 SelectRadioStation() RelayCommand 仅在用户选择不同的电台时触发,而不是在电台从服务器更新时触发?

注意:可能但不是首选解决方案 :添加一个额外的文本 block ,显示调谐到的实际广播电台,并将其绑定(bind)到 SelectedRadioStation。由于用户控件的高度,我真的不想要这个,并且更喜欢只有 1 个组合框。

MVVM 模型是这样的:

Public Class ViewModel
Inherits ViewModelBase

Public Property RadioStations As List(Of String)

Public Property SelectedRadioStation As String
Get
Return _SelectedRadioStation
End Get
Set(value As String)
_SelectedRadioStation = value
RaisePropertyChanged()
End Set
End Property
Private Property _SelectedRadioStation As String

Public ReadOnly Property SelectRadioStation As RelayCommand(Of Object)
Get
Return New RelayCommand(Of Object)(Sub(x)
Await SendSelectedRadioStationToServer()
Debug.WriteLine(String.Format("ViewModel.SelectRadioStation - executed : {0}", x.ToString))

End Sub)
End Get
End Property


Public ReadOnly Property SetRadioStation As RelayCommand
Get
Return New RelayCommand(Sub()
SelectedRadioStation = "Radio 1"
End Sub)
End Get
End Property
Public Sub New()
RadioStations = New List(Of String)
End Sub
End Class

和这样的简化应用程序:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" x:Name="RadioStationList" ItemsSource="{Binding RadioStations}" SelectedItem="{Binding SelectedRadioStation, Mode=TwoWay}">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="SelectionChanged" >
<Core:InvokeCommandAction Command="{Binding SelectRadioStation}" CommandParameter="{Binding SelectedItem, ElementName=RadioStationList}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</ComboBox>
<Button Grid.Row="1" Content="Refresh Radio by Querying the server to see to which station the radio actually is tuned to" Command="{Binding SetRadioStation}"/>
</Grid>

和 MainPage OnNavigatedTo(仅用于测试)
Protected Overrides Async Sub OnNavigatedTo(e As NavigationEventArgs)

myVM.RadioStations.Add("Radio 1")
myVM.RadioStations.Add("Radio 2")
myVM.RadioStations.Add("Radio 3")
myVM.RadioStations.Add("Radio 4")
myVM.SelectedRadioStation = "Radio 3"

DataContext = myVM

End Sub

最佳答案

保存一个包含最新选定项的局部变量。当新的选择更改事件出现时,将新值与作为局部变量保存的值进行检查。如果它们不相同,则继续选择更改事件处理程序中现在存在的逻辑,如果它们相同,则忽略它。

关于vb.net - 从后端刷新时不要触发 ComboBox SelectionChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34895857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com