Я новичок в WPF. Проект, над которым я работаю, имеет требования использовать VB в качестве языка и плоских файлов в качестве данных (я не могу изменить требования). Я только нашел (2) книги по WPF с VB по сравнению с десятками в C, а поиски в Интернете были такими же скудными. Надеясь, что кто-то есть, есть кое-какие сведения по этому вопросу с опытом VB.WPF/VB ComboBox SelectionChanged Fire Дважды
Это каскадное событие на странице. Я загружаю выпадающее поле со списком. Когда выбор производится в блоке, он делает доступным комбобокс объекта и загружает данные на основе выбранного значения единицы. Если блок снова изменится, он очистит поле объекта и перезагрузится на основе нового значения единицы.
Мой код ниже. Что действительно меня смущает, так это результаты загрузки комбобокса объекта. Он загружается, как если бы чтение плоского файла зацикливалось дважды. В верхней части функции находится код для очистки списка перед загрузкой combobox. Таким образом, если даже если функция была вызвана дважды, код должен технически очистить список, загрузить, снова очистить список и загрузить. Я ввел ряд всплывающих окон, чтобы подтвердить, что SelectionChange вызывается дважды, и поэтому средство загрузки вызывается дважды.
Я посмотрел на аргументы отправителя и e, и они одинаковы в обоих вызовах, поэтому я не уверен, как улавливать и останавливать второй вызов или что даже запускает его.
О, действительно странная вещь произошла с всплывающими окнами. Если они теперь размещены в коде VB, проблема исчезнет. Я вижу только одно появление объекта в поле со списком. Если я заберу всплывающие окна, я снова получу два события.
Кто-нибудь видит то, что мне не хватает? Заранее благодарим за отзыв и помощь.
XAML:
<Grid x:Name="gridTreat1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock x:Name="lblTreat1Title" HorizontalAlignment="Left" Margin="22,20,0,0" TextWrapping="Wrap" Text="Treatment Details 1 of 3" VerticalAlignment="Top" Width="459" FontSize="36" FontWeight="Bold"/>
<TextBox x:Name="lblUnit" Text="Unit:" HorizontalAlignment="Left" Margin="66,95,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/>
<ComboBox x:Name="cboUnit" HorizontalAlignment="Left" Margin="234,95,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="18" SelectionChanged="cboUnit_SelectionChanged">
</ComboBox>
<TextBox x:Name="lblFacility" Text="Facility:" HorizontalAlignment="Left" Margin="66,202,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/>
<ComboBox x:Name="cboFacility" HorizontalAlignment="Left" Margin="234,202,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="16" SelectionChanged="cboFacility_SelectionChanged">
</ComboBox>
<TextBox x:Name="lblPhysician" Text="Physician:" HorizontalAlignment="Left" Margin="66,256,0,0" VerticalAlignment="Top" Width="141" FontSize="18" Height="34" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/>
<ComboBox x:Name="cboPhysician" HorizontalAlignment="Left" Margin="234,256,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="16">
</ComboBox>
<TextBox x:Name="lblStep2" Text="------------------------------------------------------------------------------------------------------" HorizontalAlignment="Left" Margin="66,153,0,0" VerticalAlignment="Top" Width="754" Height="34" FontSize="18" FontWeight="Bold" BorderBrush="White" IsReadOnly="True" TabIndex="0" IsTabStop="False"/>
<Button x:Name="cmdCancel" Content="Cancel" HorizontalAlignment="Left" Margin="104,502,0,0" VerticalAlignment="Top" Width="165" Height="50" FontSize="18" />
<Button x:Name="cmdNext" Content="NEXT >>" HorizontalAlignment="Left" Margin="618,502,0,0" VerticalAlignment="Top" Width="165" Height="50" FontSize="18"/>
<Rectangle x:Name="recPatient" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="57" Margin="544,18,0,0" Stroke="Black" VerticalAlignment="Top" Width="329"/>
<TextBox x:Name="lblPRN" Text="PRN:" HorizontalAlignment="Left" Margin="550,20,0,0" VerticalAlignment="Top" Width="42" Height="20" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" IsReadOnly="True" IsTabStop="False" TabIndex="0"/>
<TextBox x:Name="lblPatName" Text="Patient:" HorizontalAlignment="Left" Margin="550,41,0,0" VerticalAlignment="Top" Width="70" Height="20" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/>
<TextBox x:Name="txtPRN" HorizontalAlignment="Left" Height="11" Margin="625,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="235" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontWeight="Bold" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/>
<TextBox x:Name="txtPatName" HorizontalAlignment="Left" Height="27" Margin="625,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="235" Background="#FFF4F4F5" BorderBrush="#FFF4F4F5" FontWeight="Bold" FontSize="14" IsReadOnly="True" IsTabStop="False" TabIndex="0"/>
<TextBox Text="CONFIDENTIAL PEER REVIEW PRIVILEGED" HorizontalAlignment="Left" Margin="290,558,0,0" VerticalAlignment="Top" FontWeight="Bold" Foreground="Red" BorderBrush="White" FontSize="14" IsTabStop="False" TabIndex="0" IsReadOnly="True"/>
<TextBox x:Name="txtTest" HorizontalAlignment="Left" Margin="423,399,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"/>
<TextBox x:Name="txtTest2" HorizontalAlignment="Left" Margin="423,436,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top"/>
</Grid>
VB код Сзади:
Private Sub cboUnit_SelectionChanged(sender As System.Object, e As SelectionChangedEventArgs) Handles cboUnit.SelectionChanged
Dim myUnit As String = ""
Dim cb As ComboBox
Dim cbi As ComboBoxItem
cb = CType(cboUnit, ComboBox)
cbi = CType(cb.SelectedItem, ComboBoxItem)
myUnit = cbi.Tag.ToString
Select Case GlobalVariable.gvAction
Case "A"
Call Load_cboFacility(myUnit)
Me.cboFacility.Visibility = Xaml.Visibility.Visible
Me.lblFacility.Visibility = Xaml.Visibility.Visible
Case "E"
Call Load_cboFacility(myUnit,"2")
End Select
End Sub
Private Async Sub Load_cboFacility(ByVal myUnit As String, Optional myIsSel As String = "")
Dim nextline As String = ""
Dim myTag As String = ""
Dim myKey As String = ""
Dim myContent As String = ""
Dim localfolder As Windows.Storage.StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder
Dim myfile As StorageFile = Await localfolder.GetFileAsync("dicFacility.txt")
Dim cb As ComboBox
Dim cbi As ComboBoxItem
Dim myMsg2 As New MessageDialog("1")
Await myMsg2.ShowAsync
cb = CType(cboFacility, ComboBox)
cb.Items.Clear()
Using reader As StreamReader = New StreamReader(Await myfile.OpenStreamForReadAsync)
Dim myMsg As New MessageDialog("2")
Await myMsg.ShowAsync
nextline = Await reader.ReadLineAsync
While (nextline <> Nothing)
myKey = nextline.Substring(0, 2)
myKey = myKey.Trim
If myUnit = myKey Then
myTag = nextline.Substring(7, 4)
myTag = myTag.Trim
myContent = nextline.Substring(18, nextline.Length - 18)
cbi = New ComboBoxItem
cbi.Tag = myTag
cbi.Content = myContent
If myIsSel <> "" Then
If myIsSel = myTag Then
cbi.IsSelected = True
End If
End If
cb.Items.Add(cbi)
End If
nextline = Await reader.ReadLineAsync
End While
End Using
End Sub
Пересмотр вопроса:
я, наконец, получил код работает как вариант того, что я думаю, что Рэйчел предложила Я делаю. Это не изящно, а работает. Если кто-то имеет более чистый путь, я открыт для предложений:
Модифицированный XAML, добавив DropDownClosed событие:
<ComboBox x:Name="cboUnit" HorizontalAlignment="Left" Margin="234,95,0,0" VerticalAlignment="Top" Width="586" Height="34" FontSize="18" SelectionChanged="cboUnit_SelectionChanged" DropDownClosed="cboUnit_Closed" />
Модифицированный VB код:
В моем файле constants.vb, я создал новую переменную, называемую gvUnitCount, и сначала установить ноль. Когда выпадающее меню закрывается, мой счетчик сбрасывается до нуля. Когда выбор изменился, он запускается один раз, и оператор IF выдает вас, если увеличивается больше.
Private Sub cboUnit_Closed(sender As System.Object, e As Object) Handles cboUnit.DropDownClosed
GlobalVariable.gvUnitCount = 0
End Sub
Private Sub cboUnit_SelectionChanged(sender As System.Object, e As SelectionChangedEventArgs) Handles cboUnit.SelectionChanged
Dim myUnit As String = ""
Dim cbUnit2 As ComboBox
Dim cbiUnit2 As ComboBoxItem
cbUnit2 = CType(cboUnit, ComboBox)
cbiUnit2 = CType(cbUnit2.SelectedItem, ComboBoxItem)
myUnit = cbiUnit2.Tag.ToString
Me.txtUnitTag.Text = cbiUnit2.Tag.ToString
If GlobalVariable.gvUnitCount = 0 Then
Select Case GlobalVariable.gvAction
Case "A"
Me.cboFacility.Visibility = Xaml.Visibility.Visible
Me.lblFacility.Visibility = Xaml.Visibility.Visible
Call Load_cboFacility(myUnit)
Me.cboPhysician.Visibility = Xaml.Visibility.Visible
Me.lblPhysician.Visibility = Xaml.Visibility.Visible
Call Load_cboPhysician(myUnit)
Case "E"
Call Load_cboFacility(myUnit)
Call Load_cboPhysician(myUnit)
End Select
GlobalVariable.gvUnitCount = GlobalVariable.gvUnitCount + 1
End If
End Sub
Как я уже сказал, не очень, но функции. Таким образом, я получаю только одно загрузочное средство.
:(Ваш XAML делает меня печальной пандой.Тем не менее, я думаю, что я думаю, что он дважды стреляет (один раз для отмены, один раз для выбора?) И работает одновременно на отдельных потоках, поэтому .Clear вызывается дважды, затем загрузка вызывается дважды, в результате получается две копии каждого пункт. Я бы предложил добавить флаг 'isLoadingFacility', который используется для предотвращения второго вызова, если коды уже загружены. – Rachel
Жаль печальная панда, я действительно сказал, что я новичок, но мне нравится ваша идея. Попробует сегодня между рейсами. Спасибо. :) – dmoody007
Я попытался помечать и изменять событие DropDownClosed вместо SelectionChanged. Мой код по-прежнему создает два экземпляра в Combo Box. Во всех случаях, после изменения элемента, вызывается дважды, после чего вызывается функция load_cboFacility дважды. Мне просто не имеет смысла, что происходит. – dmoody007