我是一个业余爱好者程序员,他坚持做一些应该很容易完成的事情......但是我看不到光明:
情境:一个简单的XAML / MVVM / VB.Net应用程序,它为用户提供了一个可以调入的无线电台的Combobox。当选择一个无线电台时,应用程序发送命令以调整服务器以进行进一步处理和实际调整(使用LogitechMediaServer / Squeezebox的人将能够很好地描绘这一点:)
但是:通过除此应用之外的其他方式,调谐的无线电台也有可能发生变化。因此,存在“刷新”按钮以使当前调谐到的无线电台。
示例代码是高度有限的用户控件的一部分。因此,我希望将ComboBox用作选择器,以及提供当前状态的方式(无线电台调整到的方式)。
问题:从服务器刷新状态时,再次触发SelectionChanged事件,该事件向服务器发送另一个Tune请求。我不希望这种情况发生。我们如何才能确保SelectRadioStation()RelayCommand仅在用户选择其他无线电台时触发,而不是在从服务器更新无线电台时触发?
注意:可能但不是首选解决方案:添加一个额外的文本块,显示调整到的实际无线电台,并将其绑定到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
答案 0 :(得分:0)
保存包含最新所选项目的本地变量。当新选择更改事件进入时,使用保持为局部变量的值检查新值。如果它们不相同则继续选择改变事件处理程序中现在存在的逻辑,如果它们相同则忽略它。